Python Tuple

Python Tuple Tutorial

Introduction:

Python tuples are a data structure used to store an ordered collection of elements. Unlike lists, tuples are immutable, meaning their values cannot be changed once created. This can be useful in situations where you want to ensure that data is not accidentally modified. Tuples are also hash able, which means they can be used as keys in dictionaries.

Creating a Tuple:

Tuples can be created using parentheses, with elements separated by commas (,) and also bu using tuple() keyword. Here’s an example.

				
					tup = (1,2,3,4)
print(tup) # Output : (1,2,3,4)

tup = tuple(1,2,3,4)
print(tup) # Output : (1,2,3,4)

				
			

Features of python tuple:

A tuple is an immutable sequence in Python that can contain elements of different data types. Here are the key features of a Python tuple:

  • 1). Immutable: Once created, a tuple cannot be modified. You cannot add, remove, or modify elements in a tuple. This immutability ensures data integrity and allows tuples to be used as keys in dictionaries.
  • 2). Ordered : Elements in a tuple are ordered and maintain their positions. The order of elements in a tuple is preserved, and you can access them using their indices.
  • 3). Heterogeneous Data Types : A tuple can store elements of different data types. For example, you can have a tuple containing an integer, a string, and a float.
  • 4). Indexing and Slicing : You can access individual elements of a tuple using their indices. Tuples support both positive and negative indexing, where negative indices count from the end of the tuple. Slicing allows you to extract a portion of the tuple by specifying a range of indices.
  • 5). Iteration : Tuples can be iterated over using loops. This allows you to access each element in the tuple sequentially.
  • 6). Hashability : Tuples are hashable, which means they can be used as keys in dictionaries and elements in sets. This property is due to their immutability.
  • 7). Nesting : Tuples can be nested inside other tuples. This allows you to create complex data structures using tuples.
  • 8). Size Efficiency : Tuples are more memory-efficient compared to lists because they are immutable. This makes tuples a suitable choice when you have a fixed collection of elements that won’t change.
  • 9). Function Arguments and Return Values : Tuples are often used to pack multiple values together and pass them as arguments to functions or return multiple values from a function.
  • 10). Tuple Packing and Unpacking: You can pack multiple values into a tuple using a comma-separated list of values. Similarly, you can unpack a tuple by assigning its elements to individual variables.

Advantages of python tuple:

  1. Immutability:

Tuples in Python are immutable, meaning once created, their elements cannot be modified. This immutability provides several advantages. Firstly, it ensures data integrity by preventing accidental modification of elements. This is particularly useful in scenarios where data should remain constant, such as configuration settings or constant lookup tables. Secondly, immutability allows tuples to be used as keys in dictionaries, as they provide a stable and unchangeable identity. This makes tuples a suitable choice for scenarios where immutability is desired.

  1. Performance Efficiency:

Tuples are more memory-efficient than lists in Python. Since tuples are immutable, they are stored more compactly in memory compared to lists, which can dynamically resize as elements are added or removed. This efficiency can be beneficial when dealing with large collections of data or in scenarios where memory optimization is crucial. Additionally, accessing elements in tuples is generally faster than accessing elements in lists since tuples have a simpler internal structure.

  1. Tuple Packing and Unpacking:

Python tuples support a convenient feature called tuple packing and unpacking. Tuple packing allows you to create tuples by grouping multiple values together. Unpacking, on the other hand, allows you to assign elements of a tuple to individual variables. This feature makes tuples useful in scenarios where you need to return multiple values from a function or swap variable values efficiently. It provides a concise and intuitive way to work with multiple elements simultaneously.

  1. Sequence Operations:

Tuples support sequence operations such as indexing and slicing, similar to lists and strings. This allows you to access specific elements or extract subsets of elements from a tuple efficiently. Additionally, tuples support iteration using loops, making them iterable data structures. This flexibility in sequence operations makes tuples suitable for various use cases, such as iterating over collections, accessing elements by index, or performing operations on specific subsets of data.

  1. Hashability and Uniqueness:

Tuples in Python are hashable, meaning they can be used as keys in dictionaries or elements in sets. This is because tuples are immutable and their hash value remains constant. This property enables efficient lookup and retrieval of data when using tuples as keys or elements. Additionally, tuples can preserve uniqueness, allowing you to store unique combinations of elements in a collection.

Disadvantages of python tuple:

  1. Immutability:

One of the primary disadvantages of tuples is their immutability. Once a tuple is created, its elements cannot be modified. While immutability provides data integrity and stability, it can be restrictive in scenarios where dynamic changes to data are required. If you need to add, remove, or modify elements frequently, a tuple might not be the most suitable data structure. In such cases, mutable data structures like lists might be more appropriate.

  1. Limited Mutability:

While tuples are immutable as a whole, they can contain mutable objects as elements. This means that if a tuple contains mutable objects like lists or dictionaries, those objects can be modified even though the tuple itself cannot be changed. However, care must be taken when modifying mutable objects within a tuple to avoid unexpected behavior or inadvertent modifications.

  1. Lack of Flexibility:

Compared to lists, tuples have limited flexibility. Tuples do not provide built-in methods for adding or removing elements, sorting, or reversing. These operations require converting the tuple to a list, performing the operation, and then converting it back to a tuple. This extra step can be cumbersome and less efficient compared to directly manipulating lists. If you anticipate frequent modifications or dynamic operations on your data, using lists might offer more flexibility.

  1. Inefficient for Large-Scale Modifications:

Due to their immutability, modifying a tuple requires creating a new tuple with the desired modifications. This process can be inefficient and memory-consuming when dealing with large-scale modifications. In such cases, mutable data structures like lists, where elements can be modified in-place, can provide better performance.

  1. Limited Data Analysis Capabilities:

Tuples are not well-suited for complex data analysis tasks or mathematical operations. While they can store numeric values, tuples lack built-in mathematical functions and libraries commonly used for advanced calculations or statistical operations. If your application requires extensive data analysis, other data structures like NumPy arrays or pandas DataFrames might be more suitable.

Deleting python tuple:

In Python, tuples are immutable data structures that allow you to store a collection of elements. Once created, a tuple cannot be modified. However, there may be scenarios where you need to delete a tuple or remove it from memory. In this article, we will explore different techniques to effectively delete a tuple in Python, considering the immutability of tuples.

Tuple Immutability:

Tuples in Python are immutable, meaning their elements cannot be modified or removed individually. This property ensures data integrity and enables tuples to be used as keys in dictionaries. However, it also implies that we cannot directly delete or modify elements within a tuple. Instead, we need to adopt alternative approaches to achieve the desired outcome.

Method 1: Using the “del” keyword:

One way to delete a tuple is by using the `del` keyword. While it cannot delete individual elements within a tuple, it can remove the entire tuple object from memory. Here’s an example:

				
					my_tup = (1, 2, 3, 4)
del my_tup

				
			

In this method, the `del` keyword is used to delete the reference to the tuple.

Method 2: Reassigning the tuple variable:

Another approach to “delete” a tuple is by reassigning the variable that references it. By assigning a new value to the variable, the old tuple becomes unreachable and eligible for garbage collection. Here’s an example:

				
					my_tup = (1, 2, 3, 4)
my_tup = ()

				
			

In this method, an empty tuple is assigned to the variable `my_tup`, effectively replacing the original tuple.

Indexing in python tuple:

In Python, tuples are immutable sequences that allow you to store a collection of elements. Indexing is a fundamental operation that enables you to access individual elements within a tuple.

Understanding Tuple Indexing:

Tuples in Python are ordered collections, meaning the elements maintain a specific order. Each element in a tuple is assigned an index, starting from 0 for the first element. Indexing allows you to retrieve individual elements based on their position within the tuple.

Accessing Elements using Positive Indexing:

Positive indexing is the most common way to access elements in a tuple. It involves using the index value starting from 0 and incrementing by one for each subsequent element.  Here’s an example:

				
					my_tup = (1, 2, 3, 4)
print(my_tuple[0])  # Accessing the first element i.e. 1
print(my_tuple[2])  # Accessing the third element i.e. 3

				
			

In this case, my_tup[0] retrieves the first element 1, and my_tup[2] retrieves the third element 2 from the tuple.

Accessing Elements using Negative Indexing:

Python also supports negative indexing, where the index counts from the end of the tuple. The last element has an index of -1, the second-to-last element has an index of -2, and so on. Negative indexing provides a convenient way to access elements from the end of the tuple. Here’s an example:

				
					my_tup = (1, 2, 3, 4)
print(my_tuple[-1])  # Accessing the last element i.e. 4
print(my_tuple[-2])  # Accessing the second last element i.e. 3

				
			

In this example, `my_tup[-1]` retrieves the last element 4, and `my_tup[-2]` retrieves the second last element 3 from the tuple.

Slicing in Python Tuples:

Understanding Tuple Slicing:

Slicing is a way to extract a portion of a sequence by specifying a range of indices. It is particularly useful when you want to work with a subset of elements within a tuple. The syntax for slicing is `start:stop:step`, where `start` is the starting index, `stop` is the ending index (exclusive), and `step` is the increment value.

Basic Slicing:

To perform a basic slice, you only need to provide the `start` and `stop` indices. This will extract the elements from the starting index up to, but not including, the ending index. Here’s an example:

				
					tup = (1, 2, 3, 4, 5)
print(tup[1:4])  # Extracting elements from index 1 to 3

				
			

In this case, the slice `tup[1:4]` retrieves elements with indices 1, 2, and 3, resulting in the tuple (2, 3, 4).

Step Value in Slicing:

You can also specify a step value to skip elements during the slice. The step value determines the increment between successive elements. Here’s an example:

				
					tup = (1, 2, 3, 4, 5)
print(tup[::3])  # Extracting every third element

				
			

In this example, the slice `tup[::3]` extracts elements with a step size of 3, resulting in the tuple (1, 5).

Negative Indices in Slicing:

Python allows the use of negative indices in slicing. Negative indices count from the end of the tuple. This can be useful when you want to extract elements from the end. Here’s an example:

				
					tup = (1, 2, 3, 4, 5)
print(tup[-4:-1])  # Extracting elements from index -4 to -2

				
			

In this case, the slice `tup [-3:-1]` retrieves elements with indices -4 and -2, resulting in the tuple (2, 3, 4).

Combining Slicing Techniques:

You can combine different slicing techniques to create more complex slices. Here’s an example:

				
					tup = (1, 2, 3, 4, 5)
print(tup[0:5:2])  # Extracting elements from index 0 to 4 with a step size of 2

				
			

In this example, the slice `tup [0:5:2]` extracts elements with indices 0, 2 and 4 resulting in the tuple (1, 3, 5).

Python tuple operators:

  1. Concatenation Operator (+):

The concatenation operator (+) allows you to combine two tuples to create a new tuple. It produces a new tuple that includes all the elements from both tuples, maintaining their order. Here’s an example:

				
					tup1 = (1, 2, 3)
tup2 = (4, 5, 6)
concatenated_tuples = tup1 + tup2

				
			

In this case, the `concatenated_tuples` will be (1, 2, 3, 4, 5, 6), resulting from the concatenation of `tup1` and `tup2`.

  1. Repetition Operator (*):

The repetition operator (*) allows you to create a new tuple by repeating the elements of an existing tuple a specified number of times. It produces a new tuple that contains the repeated elements. Here’s an example:

				
					tup = (1, 2, 3)
repeated_tup = tup * 2

				
			

In this example, the `repeated_tup` will be (1, 2, 3, 4, 1, 2, 3, 4), as the elements of `tup ` are repeated two times.

  1. Comparison Operators (==, !=, <, >, <=, >=):

You can use comparison operators to compare tuples based on their elements. The comparison is performed element-wise, starting from the first element. Here’s an example:

				
					tup1 = (1, 2, 3, 4)
tup2 = (5, 6, 7, 8)
print(tuple1 < tuple2)  # Output: True

				
			

In this case, the `<` operator compares the first element of `tup1` with the first element of `tup2` and returns True because 1 is less than 4.

  1. Membership Operators (in, not in):

Membership operators allow you to check if an element is present in a tuple or not. The `in` operator returns True if the element exists in the tuple, while the `not in` operator returns True if the element does not exist. Here’s an example:

				
					tup = (1, 2, 3)
print(1 in tup)      # Output: True
print(5 not in tup)  # Output: True

				
			

In this example, the first statement returns True as 1 is present in `tup `, while the second statement returns True as 5 is not present.

Python tuple functions:

  1. len():

The `len()` function allows you to determine the length or size of a tuple. It returns the number of elements present in the tuple. Here’s an example:

				
					tup = (1, 2, 3, 4)
tuple_length = len(tup)
print(tuple_length)  # Output: 4

				
			

In this case, `len(tup)` returns 4, as `tup ` contains four elements.

  1. min() and max():

The `min()` and `max()` functions allow you to find the minimum and maximum values, respectively, within a tuple. Here’s an example:

				
					tup = (1, 2, 3, 4, 5, 6)
minimum_value = min(tup)
maximum_value = max(tup)
print(minimum_value)  # Output: 1
print(maximum_value)  # Output: 6

				
			

In this example, `min(tup)` returns the minimum value of 1, while `max(tup)` returns the maximum value of 6.

  1. sum():

The `sum()` function allows you to calculate the sum of all the elements within a tuple. It works for tuples that contain elements that are numeric. Here’s an example:

				
					tup = (1, 2, 3, 4)
total = sum(tup)
print(total)  # Output: 10

				
			

In this case, `sum(tup)` returns 10, which is the sum of all the elements in `tup `.

  1. sorted():

The `sorted()` function returns a new sorted list containing all the elements from a tuple. Here’s an example:

				
					tup = (5, 2, 4, 3, 1)
sorted_list = sorted(tup)
print(sorted_list)  # Output: `[1, 2, 3, 4, 5]

				
			

In this example, `sorted(tup)` returns a sorted list `[1, 2, 3, 4, 5]` while leaving the original tuple unchanged.

  1. count():

The `count()` function allows you to count the occurrences of a specific element within a tuple. It returns the number of times the element appears. Here’s an example:

				
					tup = (1, 1, 2, 3, 2, 4, 1)
element_count = tup.count(1)
print(element_count)  # Output: 3

				
			

In this case, `tup.count(1)` returns 3, as the value 1 appears three times within `tup `.

Python List

Python List Introduction:

Lists are one of the most commonly used data structures in Python. A list is a collection of elements, which can be of any type, including numbers, strings, and other lists etc. Lists are mutable, which means you can make changes in the list by adding, removing, or changing elements.

List declaration:

To declare a list in Python, you can use square brackets [] and separate the elements with commas. Here’s an example:

new_list = [ 1, 2, 3, 4, 5 ]

In the above example, we created a list called new_list that contains five integers.

You can also create an empty list by using the list() function or just an empty set of square brackets [].  Here are some examples:

list_1 = list()
list_2 = []

Both of the examples above create an empty list called empty_list_1 and list_2.

You can also create a list of a specific size filled with a default value using the * operator.  Here’s an example:

empty_list_1 = []
empty_list_2 = list()

In the example above, we created a list called my_list that contains three 1 values.

my_list = [1, 1, 1]

Python list features:

  1. Mutable: Lists are mutable, meaning you can modify their elements by assigning new values to specific indices.
  2. Ordered: Lists maintain the order of elements as they are added.
  3. Dynamic Size: Python lists can dynamically grow or shrink in size as elements are added or removed.
  4. Heterogeneous Elements: Lists can contain elements of different data types. For example, a single list can store integers, floats, strings, or even other lists.
  5. Indexing and Slicing: You can access individual elements in a list using square bracket notation and their index. Additionally, you can slice lists to extract a portion of elements by specifying start and end indices.
  6. Iteration: Lists can be easily iterated over using loops or list comprehensions, allowing you to process each element or perform operations on the entire list.
  7. Built-in Functions: Python provides a range of built-in functions specifically designed for working with lists. These include functions like `len()`, `max()`, `min()`, `sum()`, `sorted()`, and more.
  8. Versatile Data Structure: Lists are a versatile data structure used in a variety of scenarios.
  9. List Comprehensions: Python allows you to create new lists by performing operations on existing lists using concise and expressive syntax called list comprehensions.
  10. Extensive Methods: Python lists come with a range of built-in methods that enable various operations like adding or removing elements, sorting, reversing, searching, and more.

Python List Indexing and Slicing

In Python first element in the list has an index of 0. You can access elements in a list by their index using square brackets. Here’s an example:

# Define a list
my_list = ['apple', 'banana', 'cherry']

# Access the first element
first_element = my_list[0] # 'apple'

# Access the second element
second_element = my_list[1] # 'banana'

# Access the third element
third_element = my_list[2] # 'cherry'

# Print the elements
print("First element:", first_element)
print("Second element:", second_element)
print("Third element:", third_element)

You can also use negative indexing to access the list elements in the reverse order. Here’s an example:

# Define a list
my_list = ['apple', 'banana', 'cherry']

# Access the last element
last_element = my_list[-1] # 'cherry'

# Access the second-to-last element
second_last_element = my_list[-2] # 'banana'

# Access the third-to-last (or first) element
third_last_element = my_list[-3] # 'apple'

# Print the elements

print("Last element:", last_element)
print("Second-to-last element:", second_last_element)
print("Third-to-last element:", third_last_element)

Slicing rules to create a sublist:

Here are the rules for slicing in Python:

  1. Slicing uses the colon : operator to specify a range of indices. The syntax is my_list[start_index:end_index:step].
  2. The start_index is the index of the first element to include in the slice. If not specified, it defaults to 0.
  3. The end_index is the index of the first element to exclude from the slice. If not specified, it defaults to the length of the list.
  4. The step parameter specifies the step size between elements in the slice. If not specified, it defaults to 1.
  5. All parameters can be negative, in which case they specify the index relative to the end of the list. For example, my_list[-1] refers to the last element of the list.
  6. Slicing returns a new list that contains the specified range of elements from the original list.

You can also use slicing to access a subset of the list. Slicing allows you to extract a range of elements from the list. Here’s an example:

# Define a list
my_list = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# Slice to get the first three elements
first_three = my_list[0:3] # ['apple', 'banana', 'cherry']

# Slice to get elements from index 2 to the end
from_second_onwards = my_list[2:] # ['cherry', 'date', 'elderberry']

# Slice to get the last two elements
last_two = my_list[-2:] # ['date', 'elderberry']

# Slice with a step of 2 (every second element)
every_second = my_list[::2] # ['apple', 'cherry', 'elderberry']

# Print the results
print("First three elements:", first_three)
print("From second onwards:", from_second_onwards)
print("Last two elements:", last_two)
print("Every second element:", every_second)

In the example above, we used slicing to extract a subset of the list that starts at index 0 and ends at index 3 (excluding index 3).


Updating list values:

Lists in Python are mutable, and their values can be updated by using the slice and assignment the ( = ) operator.

# Define a list
my_list = [1, 2, 3, 4, 5]

# Remove elements at indices 1 to 3
my_list[1:4] = []

# Print the updated list
print(my_list)

Iterating over a list

We can use a for loop to iterate over the list elements. Here’s an example:

# Define a list of fruits
fruits = ['apple', 'banana', 'cherry', 'date']

# Use a for loop to iterate over the list
for fruit in fruits:
print(fruit)

Membership operator in list

We can use operator (i.e. in or not in) on list elements. If an element is in list then it returns True. If an element is not in list it return False. Here’s an example:

# Example list
fruits = ['apple', 'banana', 'cherry', 'date']

# Using 'in' to check if an element is in the list
print('apple' in fruits) # Output: True
print('orange' in fruits) # Output: False


# Using 'not in' to check if an element is not in the list
print('grape' not in fruits) # Output: True
print('banana' not in fruits) # Output: False

Repetition on list

We can use the (*) operator for the repetition of a list. Here’s an example:

# Example list
fruits = ['apple', 'banana', 'cherry']

# Using * operator for repetition
repeated_list = fruits * 3

print(repeated_list)
# Output: ['apple', 'banana', 'cherry', 'apple', 'banana', 'cherry', 'apple', 'banana', 'cherry']

Concatenation of a list

We can use the (+) operator for the concatenation of a list. Here’s an example:

# Example lists
list1 = ['apple', 'banana']
list2 = ['cherry', 'date']

# Using + operator for concatenation
combined_list = list1 + list2

print(combined_list)
# Output: ['apple', 'banana', 'cherry', 'date']

Python String

String Introduction:

A string is a sequence of characters. In Python, you can define a string using either single quotes () or double quotes (), or triple quotes (”’ or “””) for multiline strings. Here are some examples:

Re-assign Strings:

In Python, you can reassign a string to a new value by simply assigning the new value to the variable that holds the string.  Here’s an example:

# Initial string assignment
my_string = "Hello, World!"
print("Original string:", my_string)

# Reassigning the string to a new value
my_string = "Welcome to Python!"
print("Reassigned string:", my_string)

In the example above, the first print statement outputs “Hello, World!” because my_string is initially assigned that value. Then, my_string is reassigned to “Sqatools” and the second print statement outputs the new value.

# Example to demonstrate string immutability in Python

# 1). String Concatenation
greeting = "Hello"
new_greeting = greeting + ", World!"
print("Original string (after concatenation):", greeting) # Output: Hello
print("New string (concatenation result):", new_greeting) # Output: Hello, World!

# 2). String Replacement
my_string = "Hello, Python!"
new_string = my_string.replace("Python", "World")
print("\nOriginal string (after replacement):", my_string) # Output: Hello, Python!
print("New string (replacement result):", new_string) # Output: Hello, World!

# 3). String Slicing
text = "Immutable"
sliced_text = text[:3] # Taking the first three characters
print("\nOriginal string (after slicing):", text) # Output: Immutable
print("Sliced string (slicing result):", sliced_text) # Output: Imm

Deleting string:

In Python, you cannot delete individual characters in a string because strings are immutable. However, you can delete the entire string object from memory using the del statement.  Here’s an example:

In the example above, the first print statement outputs the value of my_string, which is “Hello, World!”. Then, the del statement deletes the my_string object from memory. When we try to print my_string again, we get a NameError because the variable no longer exists.


String formatting methods:

Python provides several methods for formatting strings. Here are the most commonly used methods:

  1. The % operator: This operator allows you to format strings using placeholders, which are replaced with values at runtime. Here’s an example:
# Using the % operator for string formatting
name = "Alice"
age = 25

formatted_string = "My name is %s and I am %d years old." % (name, age)
print(formatted_string)
# Output: My name is Alice and I am 25 years old.

In the example above, %s and %d are placeholders for the name and age variables, respectively. The values of these variables are provided in a tuple that follows the % operator.


  1. The str.format() method: This method allows you to format strings using placeholders that are enclosed in curly braces. Here’s an example:
# Using the str.format() method for string formatting
name = "Alice"
age = 25

formatted_string = "My name is {} and I am {} years old.".format(name, age)
print(formatted_string)
# Output: My name is Alice and I am 25 years old.

In the example above, {} is a placeholder for the name and age variables. The values of these variables are provided as arguments to the str.format() method.


  1. F-strings: It allows you to embed expressions inside placeholders that are enclosed in curly braces preceded by the f character. Here’s an example:
# Using f-strings for string formatting
name = "Alice"
age = 25

# Embedding variables directly into the string
formatted_string = f"My name is {name} and I am {age} years old."
print(formatted_string)
# Output: My name is Alice and I am 25 years old.

In the example above, the f character before the string indicates that it is an f-string. The expressions inside the curly braces are evaluated at runtime and the resulting values are inserted into the string.


String operators:

In Python, strings support several operators that can be used to perform various operations on strings. Here are some of the most commonly used string operators:

  1. Concatenation (+): The + operator can be used to concatenate two or more strings. Here’s an example:
# Using the + operator to concatenate strings
str1 = "Hello"
str2 = "World"
combined_str = str1 + " " + str2 # Adding a space between the words

print(combined_str)
# Output: Hello World
  1. Repetition (*): The * operator can be used to repeat a string a certain number of times. Here’s an example:
# Using the * operator to repeat a string
str1 = "Hello "
repeated_str = str1 * 3 # Repeating the string 3 times

print(repeated_str)

# Output: Hello Hello Hello
  1. Membership (in): The in operator can be used to check if a substring exists within a string. It returns True if the substring is found, and False otherwise. Here’s an example:
# Using the 'in' operator to check membership
sentence = "Python is awesome!"

# Checking if a substring exists within the string
substring = "Python"
result = substring in sentence

print(result)
# Output: True
  1. Indexing ([]): The [] operator can be used to access individual characters within a string. You can use a positive index to access characters from the beginning of the string, and a negative index to access characters from the end of the string. Here’s an example:
# Using the [] operator for indexing a string
my_string = "Python"

# Accessing characters using positive indices
first_char = my_string[0] # First character
last_char = my_string[5] # Last character (index 5 for "n")

print("First character:", first_char) # Output: P
print("Last character:", last_char) # Output: n

# Accessing characters using negative indices
second_last_char = my_string[-2] # Second last character (index -2 for "o")
print("Second last character:", second_last_char) # Output: o
  1. Slicing ([start:end]): The [] operator can also be used to extract a substring (or slice) from a string. The start argument specifies the starting index of the slice (inclusive), and the end argument specifies the ending index of the slice (exclusive). Here’s an example:
# Using the [] operator for string slicing
my_string = "Python Programming"

# Extracting a substring using slicing
substring = my_string[0:6] # From index 0 to 5 (6 is exclusive)
print(substring) # Output: Python
  1. Comparison (==, !=, <, <=, >, >=): The comparison operators can be used to compare two strings alphabetically.
# Comparison of strings using various operators
string1 = "Apple"
string2 = "Banana"

# Checking if the strings are equal
print(string1 == string2) # Output: False

# Checking if the strings are not equal
print(string1 != string2) # Output: True

# Checking if string1 is alphabetically less than string2
print(string1 < string2) # Output: True

# Checking if string1 is alphabetically greater than string2
print(string1 > string2) # Output: False

# Checking if string1 is alphabetically less than or equal to string2
print(string1 <= string2) # Output: True

# Checking if string1 is alphabetically greater than or equal to string2
print(string1 >= string2) # Output: False

String indexing and slicing:

Indexing:

Indexing: Each character in a string is assigned an index starting from 0. You can access a particular character in a string using its index. Here’s an example:

# Using indexing to access characters in a string
my_string = "Python"

# Accessing individual characters using their indices
first_char = my_string[0] # First character
second_char = my_string[1] # Second character
last_char = my_string[5] # Last character

print("First character:", first_char) # Output: P
print("Second character:", second_char) # Output: y
print("Last character:", last_char) # Output: n
Slicing:

You can extract a portion of a string using slicing. Slicing is done using the [] operator, with two indices separated by a colon (:) inside the brackets. Here’s an example:

# Using slicing to extract a portion of a string
my_string = "Python Programming"

# Slicing from index 0 to 6 (exclusive of index 6)
substring = my_string[0:6] # This gives 'Python'

print(substring) # Output: Python

In the example above, my_string[0:5] returns the first five characters of the string, my_string[:5] returns all the characters up to the fifth character, and my_string[-5:] returns the characters from the fifth-last to the last character.

Note that the first index in a slice is inclusive and the second index is exclusive. So, my_string[0:5] returns characters from index 0 to index 4, but not the character at index 5.

In addition to the two indices separated by a colon, you can also add a third index to specify the step value. Here’s an example:

# Using slicing with a step
my_string = "Python Programming"

# Extracting every second character from index 0 to index 12
substring = my_string[0:13:2] # From index 0 to 12, taking every second character

print(substring) # Output: Pto rg

Python Loops

Python Loops Introduction

Loops are one of the most important concepts in Python. They allow you to execute a block of code repeatedly, which makes tasks like iterating through lists, performing calculations, or automating repetitive operations much easier

A loop in Python is used to execute a set of statements multiple times until a certain condition is met. This helps avoid writing the same code over and over again. There are mainly two types of loops in Python:

  • for loop
  • while loop

The range() function is commonly used in loops to generate a sequence of numbers. It’s very useful when you want to repeat an action a specific number of times.

Syntax:

range(start, stop, step)

  • start – the starting number (default is 0)
  • stop – the number at which the range ends (not included)
  • step – the difference between each number (default is 1)
Example 1:
Here, the loop runs 5 times, printing numbers from 0 to 4.

for i in range(5):
print(i)
Output :
0
1
2
3
4
Example 2:

for i in range(2, 10, 2):
    print(i)
Output :
2
4
6
8

A for loop is used when you know how many times you want to execute a block of code. It’s great for iterating through sequences like lists, tuples, or strings.

# Example 1: Iterating through a list|

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(fruit)
Output: 

apple
banana
cherry
# Example 2: Iterating through a string

for letter in "Python":
    print(letter)
Output:
P
y
t
h
o
n

A nested loop means having one loop inside another. This is often used for working with multidimensional data, like matrices or tables.

# Example:
for i in range(1, 4):
    for j in range(1, 4):
        print(f"i={i}, j={j}")
Output:
i=1, j=1
i=1, j=2
i=1, j=3
i=2, j=1
i=2, j=2
i=2, j=3
i=3, j=1
i=3, j=2
i=3, j=3

Here, the inner loop runs completely every time the outer loop runs once

A while loop continues to run as long as a given condition is True. You use it when you don’t know how many times you need to repeat a block of code.

Example:

count = 0
while count < 5:
    print("Count is:", count)
    count += 1
Output:

Count is: 0
Count is: 1
Count is: 2
Count is: 3
Count is: 4

If the condition never becomes False, the loop runs forever (an infinite loop). To avoid that, always make sure the condition changes within the loop.


The break statement is used to stop a loop immediately, even if the loop’s condition is still True.

# Example:

for i in range(10):
    if i == 5:
        break
    print(i)
Output:

0
1
2
3
4

The loop stops when i equals 5, skipping the rest of the iterations.

The continue statement is used to skip the rest of the code inside a loop for the current iteration and move to the next one

# Example:

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)
Output:

1
3
5
7
9

Here, every time i is even, the loop skips the print() statement and continues to the next iteration.

You can use both break and continue in the same loop to control its flow precisely.

# Example:

for i in range(10):
    if i == 3:
        continue
    if i == 8:
        break
    print(i)
Output:

0
1
2
4
5
6
7

When i is 3, the continue statement skips that iteration. When i reaches 8, the break statement stops the loop entirely

Here’s a simple example that uses both a while loop and break:

password = "python123"
attempts = 0

while attempts < 3:
    guess = input("Enter password: ")
    if guess == password:
        print("Access granted!")
        break
    else:
        print("Wrong password, try again.")
        attempts += 1
else:
    print("Too many attempts. Access denied.")

# This loop lets the user try three times before locking them out

ConceptDescriptionExample
for loopRuns a block of code a set number of timesfor i in range(5): print(i)
while loopRuns as long as a condition is truewhile x < 10:
range()Generates a sequence of numbersrange(1, 10, 2)
breakStops the loopif i == 5: break
continueSkips current iterationif i % 2 == 0: continue
Nested loopA loop inside anotherfor i in range(3): for j in range(3): …

Python DataTypes

Introduction :

In Python, every value has a specific data type associated with it. Data types define the nature of the variables, objects, or values you can work with in your code. Understanding different data types is crucial for effective programming. Let’s explore the commonly used data types in Python.


Numeric Types:

  • Integer (int): Represents whole numbers without decimal points.

In Python, the integer data type (int) represents whole numbers without any decimal points. Integers can be positive or negative, and they have no limit on their size, allowing you to work with both small and large numbers.

Example:

num1 = 10
  • Floating-Point (float): Represents decimal numbers.

In Python, the float data type represents decimal numbers. Floats are used to represent real numbers, including both positive and negative values. Unlike integers, floats can have decimal points and can represent numbers with fractional parts.

Example:

num2 = 3.14
  • Complex (complex): Represents numbers with real and imaginary parts.

In Python, the complex data type represents numbers with both real and imaginary parts. Complex numbers are often used in mathematical and scientific computations that involve complex arithmetic operations.

Example:

num3 = 4 + 5j

Sequence Types:

  • String (str): Represents a sequence of characters enclosed in quotes.

In Python, a string is a sequence of characters enclosed in single quotes (‘ ‘) or double quotes (” “). Strings are immutable, which means once created, they cannot be modified. However, you can create new strings based on existing ones.

Example:

name = "John"
  • List (list): Represents an ordered collection of items enclosed in square brackets.

In Python, a list is a versatile and mutable data type that represents an ordered collection of items. Lists can contain elements of different data types, such as numbers, strings, or even other lists. Lists are denoted by square brackets [ ].

Example:

numbers = [1, 2, 3, 4, 5]
  • Tuple (tuple): Represents an ordered collection of items enclosed in parentheses.

In Python, a tuple is an ordered collection of elements, similar to a list. However, unlike lists, tuples are immutable, meaning they cannot be modified once created. Tuples are typically denoted by parentheses ( ) or can be created without any delimiters.

Example:

coordinates = (10, 20, 30, 40)

Dictionary (dict):

Represents a collection of key-value pairs enclosed in curly braces.

In Python, a dictionary is an unordered collection of key-value pairs. It is also known as an associative array or a hash map. Dictionaries are enclosed in curly braces { }, and each item in the dictionary is represented as a key-value pair separated by a colon (:).

Example:

person = {"name": "John", "age": 25, "city": "New York"}

Set Types:

Set (set): Represents an unordered collection of unique items enclosed in curly braces.

In Python, a set is an unordered collection of unique elements. Sets are denoted by curly braces { }. Each element in a set must be unique, and duplicate values are automatically removed. Sets are mutable, meaning you can modify them after creation.

Example:

fruits = {"apple", "banana", "orange"}

Boolean Type:

Boolean (bool): Represents either True or False.

In Python, the Boolean data type represents truth values. A Boolean value can be either True or False. Booleans are often used for logical operations and comparisons.

In Python, the keywords True and False (with the first letter capitalized) are used to represent Boolean values.

Example:

is_active = True
is_admin = False

Python Conditional Statements

Introduction:

In Python, the if-else statement allows you to execute different blocks of code based on certain conditions. It provides a way to make decisions and control the flow of your program.

The `if` statement is the fundamental building block of a conditional statement. It allows you to execute a block of code if a certain condition is true. The syntax of the `if` statement is as follows:

if condition:
# Code block to execute if the condition is True

The `else` statement is used in conjunction with the `if` statement. It provides an alternative block of code to execute when the condition in the `if` statement is false. The syntax is as follows:

The basic syntax of an if-else statement in Python is as follows:

if condition:
# Code block to execute if the condition is True
else:
# Code block to execute if the condition is False

The condition is an expression that evaluates to either True or False. If the condition is True, the code block immediately following the if statement will be executed. Otherwise, if the condition is False, the code block following the else statement will be executed.

Let’s look at an example to understand it better. Suppose we want to check whether a given number is positive or negative:

number = int(input("Enter a number: "))
if number > 0:
print("The number is positive.")
else:
print("The number is negative or zero.")

In this example, we use the input() function to get a number from the user, convert it to an integer using int(), and store it in the number variable. The if-else statement then checks whether the number is greater than zero. If it is, it prints “The number is positive.” Otherwise, it prints “The number is negative or zero.”


The `elif` statement allows you to check additional conditions after an initial `if` statement. It provides a way to handle multiple cases within the same conditional statement. The syntax is as follows:

Here’s an example that checks whether a number is positive, negative, or zero:

number = int(input("Enter a number: "))
if number > 0:
print("The number is positive.")
elif number < 0:
print("The number is negative.")
else:
print("The number is zero.")

In this case, the elif statement allows us to check an additional condition. If the first condition is False, it moves to the elif statement and checks whether the number is less than zero. If that condition is True, it prints “The number is negative.” Finally, if both the first and second conditions are False, it executes the code block under the else statement and prints “The number is zero.”


In Python, nested if-else statements allow you to have if-else statements within other if-else statements. They provide a way to handle complex conditions and execute different blocks of code based on multiple conditions. The basic syntax of a nested if-else statement in Python is as follows:

if condition1:
# code to execute if condition1 is true
if condition2:
# code to execute if condition1 and condition2 true
else:
# code execute if condition1 true but condition2 false
else:
# code to execute if condition1 is false

In a nested if-else statement, the inner if-else statement is indented further to the right than the outer if-else statement. The inner if-else statement is evaluated only if the condition of the outer if statement is `True`. Here’s an example:

age = 25
has_membership = True

if age >= 18:
if has_membership:
print("Welcome to the exclusive club!")
else:
print("Membership required for entry.")
else:
print("You must be 18 or older to enter.")

Python Variables

Introduction:

Variables are an important concept in any programming language, including Python. In simple language, a variable is a named location in memory that stores a value. In Python, you can use variables to store any type of data, including numbers, strings, and even complex data structures like lists and dictionaries.

Creating Variables in Python:

To create a variable in Python, you need to give it a name and assign a value to it. Here’s an example:

Name = “Omkar”
Age = 25
Profession = “Software Engineer “

Python Variable Naming Rules:

When creating variables in Python, there are a few rules that you need to follow:
1). Variable names must start with a letter or underscore (_), followed by any combination of letters, digits, and underscores.
2). Variable names are case-sensitive, which means name and Name are two different variables.
3). A variable name cannot start with a number.
4). A variable name can only contain alphanumeric characters and underscores (A-z, 0-9, and _ ).


Python Variable Types:

1). Numbers: Consists of integers, floating-point numbers, and complex numbers.
2). Strings: Consist of characters in quotes.
3). Booleans: Consist of True or False values.
4). Lists: Consist of ordered sequences of elements.
5). Tuples: Consist of ordered, immutable sequences of elements.
6). Sets: Consist of unordered collections of unique elements.
7). Dictionaries – Consist of unordered collections of key-value pairs.

Checking Types of the Variable:

First, we will create some variables.

Name = “ Omkar “
Age = 25
Height = 5.8 ft

To check the type of the variable use the type() function.

print(type(Name))    # Output: <class ‘str’>
print(type(Age))          # Output: <class ‘int’>
print(type(Height))      # Output: <class ‘float’>

To check the address of the variable, use the id() function.

print(id(Name))      # Output: 2623848788368
print(id(Age)) # Output: 140718085367336
print(id(Height)) # Output: 2623846066576

Value Assignment:

To assign the value to a variable, use the equal sign (=).
Example:
A = 10
Assign the same value to multiple variables.
A = B = C = 10

Multiple Value Assignment:

We can assign different values to different variables at the same time. We separate the variables and their values by commas ‘,’.

Example:
a, b, c = 40, 50, 60
Here,
Value of variable a is 40 , b is 50 and c is 60.

Scope of Variable:

In Python, the scope of a variable determines where in the code the variable can be accessed and used. The scope of a variable is defined by where the variable is created and assigned a value.
There are two types of variable scopes in Python: global scope and local scope.

1). Global Scope:
Variables created outside of any function or class have a global scope. This means that they can be accessed and modified from anywhere in the code, including within functions and classes.
Example:

number = 100         # global variable

def print_number():
print(number) # accessing global variable

def modify_number():
global number # declaring number as global variable
number = 200 # modifying global variable

print_number() # Output: 100
modify_number()
print_number() # Output: 200

In the example above, the variable number is declared outside of any function, so it has a global scope. The function print_number() can access and print the value of number, and the function modify_number() can modify the value of number by declaring it as a global variable using the global keyword.

2). Local Scope:
Variables created inside a function or class have a local scope. This means that they can only be accessed and modified within that function or class.
Example:

def my_function():
number = 100 # local variable
print(number) # accessing local variable

my_function() # Output: 100
print(number) # NameError: name 'number' is not defined

Basic Mathematical Operations Using Variables:

Creating variables and assigning values to them:
a, b = 10 , 20

Performing operations and printing output:

print(a+b) # Addition       Output: 30
print(a-b) # Subtraction Output: -10
print(a*b) # Multiplication Output: 200
print(a/b) # Division Output: 0.5

NumPy MCQ : Set 6

Python NumPy MCQ

1). What is the output of the following code?

				
					import numpy as np
x = np.array([[4, 8, 0], [2, 0, 6]])
print("Number of non-zero elements: ", np.count_nonzero(x))
				
			

a) 4
b) 5
c) 6
d) 7

Correct answer is: a) 4
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[4, 8, 0], [2, 0, 6]]. The `np.count_nonzero()` function is then used to count the number of non-zero elements in the array `x`.

2). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3],
              [7, 4]])
print("Median of array:", np.median(x))
				
			

a) 3
b) 4
c) 5
d) 6

Correct answer is: b) 4.5
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.median()` function is then used to calculate the median of all elements in the array `x`.

3). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3], [7, 4]])
print("Median of array along row:", np.median(x, axis=0))
				
			

a) [5, 3]
b) [7, 4]
c) [6, 3.5]
d) [4, 5]

Correct answer is: c) [6, 3.5]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.median()` function is then used to calculate the median of the array along the rows, which means the median is computed for each column.

4). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3], [7, 4]])
print("Median of array along column:", np.median(x, axis=1))
				
			

a) [4.0, 3.5]
b) [3.5, 4.0]
c) [3.0, 5.5]
d) [5.5, 3.0]

Correct answer is: a) [4.0, 5.5]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.median()` function is then used to calculate the median along the column (axis 1) of the array `x`.

5). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[4, 8, 0], [2, 0, 6]])

for ele in np.nditer(x):
    print(ele, end=' ')
				
			

a) It prints the elements of the 2-dimensional NumPy array `x`.
b) It calculates the sum of all elements in the 2-dimensional NumPy array `x`.
c) It reshapes the 2-dimensional NumPy array `x` to a 1-dimensional array.
d) It creates a new 2-dimensional array with the same elements as `x`.

Correct answer is: a) It prints the elements of the 2-dimensional NumPy array `x`.
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[4, 8, 0], [2, 0, 6]]. It then uses a loop to iterate through the elements of the array `x` using the `np.nditer()` function. The `np.nditer()` function in NumPy allows iterating over all elements of an array regardless of its shape and dimensions. In the code, each element of the array `x` is printed using the loop with `print(ele, end=’ ‘)`.

6). What is the purpose of the following code?

				
					import numpy as np
x = np.array([2, 6, 3, 1])
print("Square of every element in the array: ", np.square(x))

				
			

a) It calculates the sum of all elements in the array `x`.
b) It calculates the mean of all elements in the array `x`.
c) It calculates the product of all elements in the array `x`.
d) It calculates the square of each element in the array `x`.

Correct answer is: d) It calculates the square of each element in the array `x`.
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [2, 6, 3, 1]. The `np.square()` function is then used to calculate the square of each element in the array `x`.

7). What is the output of the following code?

				
					import numpy as np
x = np.array([[4, 8, 0], [2, 0, 6]])
y = np.array([[5], [7]])

print(np.append(x, y, axis=1))
				
			

a) [[4, 8, 0], [2, 0, 6], [5], [7]]
b) [[4, 8, 0, 5], [2, 0, 6, 7]]
c) [[4, 5], [8, 7], [0, 0], [2, 6]]
d) [[4, 8, 0], [2, 0, 6], [5, 7]]

Correct answer is: b) [[4, 8, 0, 5], [2, 0, 6, 7]]
Explanation: The given code imports the NumPy library and creates two NumPy arrays `x` and `y`. The array `x` is a 2-dimensional array with the elements [[4, 8, 0], [2, 0, 6]]. The array `y` is a 2-dimensional array with the elements [[5], [7]]. The `np.append()` function is then used to append the array `y` to the array `x` along axis 1 (columns).

8). What is the output of the following code?

				
					import numpy as np
x = np.array([[4, 8, np.nan], [2, 4, 6]])
print("Old: \n", x)

print("New: \n", x[~np.isnan(x).any(axis=1)])
				
			

a) Old:
[[ 4. 8. nan]
[ 2. 4. 6.]]
New:
[[2. 4. 6.]]

b) Old:
[[ 4. 8. nan]
[ 2. 4. 6.]]
New:
[[4. 8. nan]]

c) Old:
[[ 4. 8. nan]
[ 2. 4. 6.]]
New:
[[4. 8. 6.]]

d) Old:
[[ 4. 8. nan]
[ 2. 4. 6.]]
New:
[[ 4. 8. nan]
[ 2. 4. 6.]]

Correct answer is: a) Old:
[[ 4. 8. nan]
[ 2. 4. 6.]]
New:
[[2. 4. 6.]]
Explanation: The given code uses NumPy to perform operations on a 2-dimensional array `x`, which contains some NaN (Not a Number) values. Let’s break down the code step by step. The code uses `np.isnan(x)` to create a boolean array, where `True` indicates the positions with NaN values in the original array. The `any(axis=1)` checks if there is any `True` in each row of the boolean array. The `~` is the logical NOT operator, which negates the boolean array. The modified array contains only the rows that do not have any NaN values. In this case, the row `[4, 8, nan]` is removed from the array, leaving only the row `[2, 4, 6]`.

9). What is the output of the following code?

				
					import numpy as np
x = np.array([3, 5, 1])
print("Magnitude of the given vector: ", np.linalg.norm(x))

				
			

a) 9
b) 3
c) 5.916079783099616
d) 35

Correct answer is: c) 5.916079783099616
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [3, 5, 1]. The `np.linalg.norm()` function is then used to calculate the magnitude (Euclidean norm) of the vector `x`. The magnitude of a vector is calculated as the square root of the sum of the squares of its elements.

10). What is the output of the following code?

				
					import numpy as np
x = np.array([8, 6, 7, 0, 7, 8, 6, 6])

unique, count = np.unique(x, return_counts=True)
print("Frequency of unique values in the given array:")
print(np.asarray((unique, count)))
				
			

a) [6, 7, 8, 0] [3, 2, 2, 1]
b) [0, 6, 7, 8] [1, 3, 2, 2]
c) [0, 6, 7, 8] [2, 3, 2, 1]
d) [0, 6, 7, 8] [3, 2, 1, 2]

Correct answer is: b) [0, 6, 7, 8] [1, 3, 2, 2]
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [8, 6, 7, 0, 7, 8, 6, 6]. The `np.unique()` function is then used with the parameter `return_counts=True` to find the unique values and their corresponding frequencies in the array `x`.

11). What is the output of the following code?

				
					import numpy as np
x = np.array([4, 8, 0])

if x.size == 0:
    print("Array is empty")
else:
    print("Array is not empty")

				
			

a) Array is empty
b) Array is not empty
c) 4 8 0
d) 3

Correct answer is: b) Array is not empty
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [4, 8, 0]. The code then checks the size of the array using the `x.size` attribute. Since `x` contains three elements, its size is not equal to zero. Therefore, the condition `x.size == 0` evaluates to False. As a result, the code enters the `else` block and prints “Array is not empty”.

12). What is the output of the following code?

				
					import numpy as np
x = np.array([3, 5, 1])
print("Product of the elements in the given array: ", x.prod())

				
			

a) 3
b) 15
c) 8
d) 11

Correct answer is: b) 15
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [3, 5, 1]. The `x.prod()` function is then used to calculate the product of all elements in the array `x`.

13). What is the purpose of the following code?

				
					import pandas as pd
import numpy as np
 
x = np.arange(1, 16).reshape(3, 5)
 
DF = pd.DataFrame(x)
DF.to_csv("data1.csv")

df = pd.read_csv("data1.csv")
print(df)
				
			

a) It generates a NumPy array with numbers from 1 to 15 and reshapes it to a 3×5 matrix, then saves it as a CSV file.
b) It reads a CSV file named “data1.csv” and prints its content as a Pandas DataFrame.
c) It generates a Pandas DataFrame from a CSV file named “data1.csv” and prints its content.
d) It converts a NumPy array to a Pandas DataFrame and saves it as a CSV file named “data1.csv”.

Correct answer is: a) It generates a NumPy array with numbers from 1 to 15 and reshapes it to a 3×5 matrix, then saves it as a CSV file.
Explanation: `import pandas as pd`: Imports the Pandas library with the alias `pd`. `import numpy as np`: Imports the NumPy library with the alias `np`. `x = np.arange(1, 16).reshape(3, 5)`: Generates a NumPy array with numbers from 1 to 15 using `np.arange()` and reshapes it to a 3×5 matrix using `reshape()` method. `DF = pd.DataFrame(x)`: Creates a Pandas DataFrame `DF` from the NumPy array `x`. `DF.to_csv(“data1.csv”)`: Saves the Pandas DataFrame `DF` as a CSV file named “data1.csv”. `df = pd.read_csv(“data1.csv”)`: Reads the CSV file “data1.csv” and creates a new Pandas DataFrame `df`. `print(df)`: Prints the content of the Pandas DataFrame `df`.

14). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[6, 5, 7], [10, 9, 1], [7, 8, 2]])

for i in range(0, 2):
    print(f"{i+1} column: ", x[:, i])
				
			

a) It prints the sum of elements in each row of the array `x`.
b) It prints the transpose of the array `x`.
c) It prints the first two columns of the array `x`.
d) It prints the elements of the second row in reverse order.

Correct answer is: c) It prints the first two columns of the array `x`.
Explanation: The given code imports the NumPy library and creates a 3×3 2-dimensional NumPy array `x` with the elements. The code then uses a for loop to iterate over the columns of `x` with the range from 0 to 2 (excluding 2). For each iteration, it prints the respective column of the array `x` using the slicing syntax `x[:, i]`, where `i` is the column index.

15). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[6, 5, 7], [10, 9, 1], [7, 8, 2]])
print(x[0:2, 0:2])
				
			

a) Prints the first two elements of each row.
b) Prints the first two rows and first two columns of the array.
c) Prints the first two rows and first three columns of the array.
d) Prints the first two elements of each column.

Correct answer is: b) Prints the first two rows and first two columns of the array.
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements: The code then uses slicing to extract a sub-array from `x` using the notation `x[0:2, 0:2]`.
Slicing notation `x[0:2, 0:2]` means the following:
– `0:2` selects the first and second rows (index 0 and 1) of the array.
– `0:2` selects the first and second columns (index 0 and 1) of the array.

16). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5, 7], [10, 9, 1], [7, 8, 2]])
print("Sum of all columns: ", x.sum(axis=0))

				
			

a) [23, 22, 10]
b) [6, 5, 7, 10, 9, 1, 7, 8, 2]
c) [17, 22, 10]
d) [23, 9, 17]

Correct answer is: a) [23, 22, 10]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements: The `x.sum(axis=0)` calculates the sum of all columns (along axis 0) in the array `x`.
The sum of each column is calculated as follows:
Column 1 sum: 6 + 10 + 7 = 23
Column 2 sum: 5 + 9 + 8 = 22
Column 3 sum: 7 + 1 + 2 = 10

17). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5, np.nan], [np.nan, 9, 1], [7, 8, 2]])

temp = np.ma.masked_array(x, np.isnan(x))
print("Array after removing nan values: \n", temp)

				
			

a)
[[6.0 5.0 –]
[– 9.0 1.0]
[7.0 8.0 2.0]]

b)
[[6.0 5.0 0.0]
[0.0 9.0 1.0]
[7.0 8.0 2.0]]

c)
[[6.0 5.0 0.0]
[0.0 9.0 1.0]
[7.0 8.0 2.0]]

d)
[[6.0 5.0 1.0]
[1.0 9.0 1.0]
[7.0 8.0 2.0]]

Correct answer is: a)
[[6.0 5.0 –]
[– 9.0 1.0]
[7.0 8.0 2.0]]
Explanation: The given code creates a 2-dimensional NumPy array `x` with the elements [[6, 5, np.nan], [np.nan, 9, 1], [7, 8, 2]]. The `np.isnan()` function is used to identify the NaN (Not a Number) values in the array `x`. The `np.ma.masked_array()` function then creates a masked array where the NaN values are masked or hidden. The masked array `temp` will have the NaN values replaced with ‘–‘, representing that these values are masked and not considered in computations.

18). What is the output of the following code?

				
					import numpy as np
x = np.array([1, 2, 3])
y = np.array([4, 5, 6])

output = np.concatenate((x, y))
print("\nAfter concatenate:")
print(output)
				
			

a) [1, 2, 3, 4, 5, 6]
b) [[1, 2, 3], [4, 5, 6]]
c) [[1, 2, 3, 4, 5, 6]]
d) [5, 7, 9]

Correct answer is: a) [1, 2, 3, 4, 5, 6]
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays, `x` and `y`. The `np.concatenate()` function is then used to concatenate these two arrays. The `np.concatenate()` function concatenates arrays along a specified axis. If the axis is not specified, it defaults to 0, which means the arrays will be concatenated along the first dimension.

19). What is the purpose of the following code?

				
					import numpy as np
import pandas as pd
x = np.random.rand(6, 3)

df = pd.DataFrame(x, columns=['A', 'B', 'C'])
print("\nPandas DataFrame: ")
print(df)
				
			

a) It generates a NumPy array of random floating-point numbers with a shape of (6, 3).
b) It generates a Pandas DataFrame with 6 rows and 3 columns containing random floating-point numbers.
c) It calculates the mean of a Pandas DataFrame and prints the result.
d) It creates a Pandas DataFrame from a given NumPy array and prints the DataFrame.

Correct answer is: b) It generates a Pandas DataFrame with 6 rows and 3 columns containing random floating-point numbers.
Explanation:
1. The code imports the NumPy library as `np` and the Pandas library as `pd`.
2. The `np.random.rand(6, 3)` function generates a NumPy array of random floating-point numbers with a shape of (6, 3).
3. The `pd.DataFrame()` function takes the NumPy array `x` and converts it into a Pandas DataFrame with 6 rows and 3 columns. The columns are labeled as ‘A’, ‘B’, and ‘C’ respectively, as specified by the `columns` parameter.
4. The `print(df)` statement displays the Pandas DataFrame, showing the 6 rows and 3 columns of random floating-point numbers.

20). What is the output of the following code?

				
					import numpy as np
x = np.arange(15).reshape(3, 5)
y = np.arange(20).reshape(4, 5)

if x.shape == y.shape:
    print("Same dimensions")
else:
    print("Different dimensions")
				
			

a) Same dimensions
b) Different dimensions

Correct answer is: b) Different dimensions
Explanation: The given code imports the NumPy library and creates two NumPy arrays, `x` and `y`. The array `x` is created using `np.arange(15)` and reshaped into a 3×5 array, while the array `y` is created using `np.arange(20)` and reshaped into a 4×5 array. Next, the code checks whether the shapes of arrays `x` and `y` are equal using the `x.shape == y.shape` condition. If the shapes are equal, it prints “Same dimensions”, and if the shapes are different, it prints “Different dimensions”.

21). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5, 7], [10, 9, 1], [7, 8, 2]])

print((~x.any(axis=0)).any())
				
			

a) True
b) False

Correct answer is: b) False
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5, 7], [10, 9, 1], [7, 8, 2]]. The expression `(~x.any(axis=0))` is used to find the columns in the array `x` that contain at least one nonzero element. The `x.any(axis=0)` returns a boolean array indicating for each column whether it contains at least one nonzero element.

22). What is the output of the following code?

				
					import numpy as np
angle = np.array([45, 13])
print(f"Sin of {angle}: ", np.sin(angle))
				
			

a) [0.85090352, 0.42016704]
b) [0.52532199, 0.96355819]
c) [0.01745241, 0.85607777]
d) [0.57357644, 0.14112001]

Correct answer is: a) [0.85090352, 0.42016704]
Explanation: The given code imports the NumPy library and creates a NumPy array `angle` with the elements [45, 13]. The `np.sin()` function is then used to calculate the sine of the angles in the `angle` array. The sine of an angle in degrees can be calculated using the NumPy `sin()` function, which takes an array of angles in radians as input. To convert degrees to radians, we need to multiply the angle by π/180.

23). What is the purpose of the following code?

				
					import numpy as np
age = np.array([20, 25, 21, 23, 26, 27, 26, 30, 24, 26])

print("Standard Deviation: ", np.std(age))
				
			

a) It calculates the mean age of the given data.
b) It calculates the variance of the ages in the dataset.
c) It calculates the standard deviation of the ages in the dataset.
d) It calculates the total number of elements in the array.

Correct answer is: c) It calculates the standard deviation of the ages in the dataset.
Explanation: The given code imports the NumPy library and creates a NumPy array `age` containing the ages of a group of individuals. The `np.std()` function is then used to calculate the standard deviation of the ages in the dataset. The standard deviation is a measure of how spread out the values are from the mean. It is calculated using the formula:
Standard Deviation = sqrt((Σ (x – mean)^2) / N)
where:
– `x` represents each individual value (age) in the dataset.
– `mean` is the mean (average) of the ages.
– `N` is the total number of elements (ages) in the dataset.

24). What is the purpose of the following code?

				
					import numpy as np
arr = np.array([12.202, 90.23120, 123.88, 23.202])  
print(np.round(arr, 2))
				
			

a) It calculates the mean of the array elements.
b) It calculates the standard deviation of the array elements.
c) It rounds the array elements to the nearest integer.
d) It rounds the array elements to two decimal places.

Correct answer is: d) It rounds the array elements to two decimal places.
Explanation: The given code imports the NumPy library and creates a NumPy array `arr` with the elements [12.202, 90.23120, 123.88, 23.202]. The `np.round()` function is then used to round the elements of the array `arr` to two decimal places. The rounded array elements are as follows:
Rounded array = [12.20, 90.23, 123.88, 23.20]

25). What is the output of the following code?

				
					import numpy as np
arr = np.array([12.202, 90.23120, 123.88, 23.202])

print(np.floor(arr))
				
			

a) [12, 90, 123, 23]
b) [12.0, 90.0, 123.0, 23.0]
c) [13, 91, 124, 24]
d) [12.202, 90.231, 123.88, 23.202]

Correct answer is: a) [12, 90, 123, 23]
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `arr` with the elements [12.202, 90.23120, 123.88, 23.202]. The `np.floor()` function is then used to round down each element in the array `arr` to the nearest integer.

NumPy MCQ : Set 5

Python NumPy MCQ

1). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3],
              [7, 4]])
print("Sum of each row : ", np.sum(x, axis=1))

				
			

a) [8, 11]
b) [12, 17]
c) [6, 11]
d) [9, 14]

Correct answer is: a) [8, 11]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.sum()` function is then used to calculate the sum of each row in the array `x` along `axis=1`.

2). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3],
              [7, 4]])
print("Sum of each column: ", np.sum(x, axis=0))

				
			

a) [12, 7]
b) [8, 9]
c) [19, 7]
d) [5, 3, 7, 4]

Correct answer is: a) [12, 7]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.sum()` function is then used to calculate the sum of each column in the array `x` along `axis=0`.

3). What is the output of the following code?

				
					import numpy as np
x = np.array([5, 3])
y = np.array([7, 4])
print("Inner-dot product: ", np.dot(x, y))
				
			

a) 31
b) 29
c) 39
d) 33

Correct answer is: a) 47
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays `x` and `y` with the elements [5, 3] and [7, 4] respectively. The `np.dot()` function is then used to calculate the inner-dot product of the arrays `x` and `y`.

4). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3],
              [7, 4]])
print("Original matrix: \n", x)
vector = np.array([2, 5])
print("Vector to be added: \n", vector)

for i in range(len(x)):
    x[i, :] = x[i, :] + vector
    
print("Matrix after adding a vector: \n", x)
				
			

a)
Original matrix:
[[5 3]
[7 4]]
Vector to be added:
[2 5]
Matrix after adding a vector:
[[7 8]
[9 9]]

b)
Original matrix:
[[5 3]
[7 4]]
Vector to be added:
[2 5]
Matrix after adding a vector:
[[ 7 8]
[ 9 10]]

c)
Original matrix:
[[5 3]
[7 4]]
Vector to be added:
[2 5]
Matrix after adding a vector:
[[ 7 5]
[ 9 4]]

d)
Original matrix:
[[5 3]
[7 4]]
Vector to be added:
[2 5]
Matrix after adding a vector:
[[ 7 5]
[ 9 9]]

Correct answer is: a)
Original matrix:
[[5 3]
[7 4]]
Vector to be added:
[2 5]
Matrix after adding a vector:
[[7 8]
[9 9]]
Explanation: The given code initializes a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]] and a 1-dimensional NumPy array `vector` with the elements [2, 5]. The code then adds the `vector` to each row of the `x` array in a loop.

5). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[3, 0],
             [6, 4]])
print("Matrix: \n", x)
y = x.tolist()
print("List: ", y)
				
			

a) The code calculates the sum of all elements in the NumPy array `x`.
b) The code converts the NumPy array `x` into a list `y`.
c) The code reshapes the NumPy array `x` into a 1-dimensional array.
d) The code transposes the rows and columns of the NumPy array `x`.

Correct answer is: b) The code converts the NumPy array `x` into a list `y`.
Explanation: The given code snippet demonstrates the use of NumPy and Python’s built-in `tolist()` function. 

6). What is the output of the following code?

				
					import numpy as np
x = np.array([[1, 5, np.nan],
              [8, np.nan, 9]])
print(np.isnan(x))
				
			

a) [[False, False, True], [False, True, False]]
b) [[True, True, False], [False, False, True]]
c) [[False, True, False], [True, False, False]]
d) [[False, False, False], [False, False, False]]

Correct answer is: a) [[False, False, True], [False, True, False]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with some elements being NaN (Not a Number). The `np.isnan()` function is then used to check if the elements in the array are NaN or not. The output of `np.isnan(x)` will be a Boolean array with the same shape as `x`, where each element is `True` if the corresponding element in `x` is NaN, and `False` otherwise.

7). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 6],
              [7, 8],
              [9, 10]])
print(x.transpose())
				
			

a) [[5, 6],
[7, 8],
[9, 10]]

b) [[5, 7, 9],
[6, 8, 10]]

c) [[5, 7, 9],
[6, 8, 10],
[9, 10]]

d) [[5, 6],
[6, 7],
[7, 8],
[8, 9],
[9, 10]]

Correct answer is: b) [[5, 7, 9],
[6, 8, 10]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 6], [7, 8], [9, 10]]. The `x.transpose()` function is then used to calculate the transpose of the array `x`. The transpose of a 2-dimensional array is obtained by flipping the rows and columns. So, the resulting array will have the elements of `x` interchanged between rows and columns.

8). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

print("Sorting matrix by row: ")
print(np.sort(x))
				
			

a) [[5 6]
[9 10]
[7 8]]
b) [[6 5]
[10 9]
[8 7]]
c) [[5 6]
[7 8]
[9 10]]
d) [[10 9]
[8 7]
[6 5]]

Correct answer is: c) [[5 6]
[7 8]
[9 10]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. The `np.sort()` function is then used to sort the elements of `x` along each row.

9). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

print("Sorting matrix by column: ")
print(np.sort(x, axis=0))
				
			

a)
[[ 5 5]
[ 8 7]
[10 9]]

b)
[[ 5 6]
[ 7 8]
[ 9 10]]

c)
[[ 6 5]
[ 9 10]
[ 7 8]]

d)
[[ 7 5]
[ 8 6]
[10 9]]

Correct answer is: b)
[[ 5 6]
[ 7 8]
[ 9 10]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. The `np.sort()` function is then used to sort the elements of the array `x` along axis 0, which means sorting along the columns.

10). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

print("Values bigger than 7 =", x[x>7])
				
			

a) Values bigger than 7 = [10, 9, 8, 7]
b) Values bigger than 7 = [10, 9, 8]
c) Values bigger than 7 = [8, 7]
d) Values bigger than 7 = [6, 5]

Correct answer is: b) Values bigger than 7 = [10, 9, 8]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. The code then uses boolean indexing (`x>7`) to extract the elements from `x` that are bigger than 7.

11). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

x[x >= 7] = 0
print("New matrix")
print(x)
				
			

a) [[0, 0], [0, 0], [0, 0]]
b) [[6, 5], [10, 9], [8, 7]]
c) [[6, 5], [0, 0], [0, 0]]
d) [[0, 5], [0, 9], [0, 7]]

Correct answer is: c) [[6, 5], [0, 0], [0, 0]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. It then modifies the elements of the array `x` based on the condition `x >= 7`. Any element in the array that is greater than or equal to 7 is replaced with 0.

12). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])
print("Original array: ", x)
print("After swapping")
new = print(x[::-1, :])
				
			

a) The code transposes the original array.
b) The code reverses the rows of the original array.
c) The code reverses the columns of the original array.
d) The code prints the original array in reverse order.

Correct answer is: b) The code reverses the rows of the original array.
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. It then prints the original array using `print(“Original array: “, x)`. The line `new = print(x[::-1, :])` involves array slicing. Specifically, `x[::-1, :]` reverses the rows of the original array `x`.

13). What is the output of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

x[0,:] = x[0,:]*2
print("After multiplying the first row by 2: ", x)
				
			

a) [[12, 10], [10, 9], [8, 7]]
b) [[12, 10], [20, 18], [16, 14]]
c) [[6, 5], [10, 9], [8, 7]]
d) [[6, 5], [10, 9], [8, 7, 2]]

Correct answer is: a) [[12, 10], [10, 9], [8, 7]]
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. Next, it modifies the first row of the array `x` by multiplying it by 2.

14). What is the purpose of the following code?

				
					import numpy as np
x = np.array([[6, 5],
              [10, 9],
              [8, 7]])

x[0,:] = x[0,:] + x[1,:]
print("After addition: ", x)
				
			

a) It transposes the matrix `x`
b) It calculates the element-wise addition of the first and second rows in the matrix `x`
c) It calculates the dot product of the first and second rows in the matrix `x`
d) It reshapes the matrix `x` into a 1-dimensional array

Correct answer is: b) It calculates the element-wise addition of the first and second rows in the matrix `x`
Explanation: The given code snippet imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[6, 5], [10, 9], [8, 7]]. The line `x[0,:] = x[0,:] + x[1,:]` performs element-wise addition of the first row (`[6, 5]`) and the second row (`[10, 9]`) of the matrix `x`. The result is then assigned back to the first row of the matrix `x`.

15). What is the output of the following code?

				
					import numpy as np
x = np.array([6+2j, 10+5j])
print("Real part: ", x.real)
print("Imaginary part: ", x.imag)
				
			

a) Real part: [6, 10], Imaginary part: [2, 5]
b) Real part: [8, 15], Imaginary part: [2, 5]
c) Real part: [6, 10], Imaginary part: [2j, 5j]
d) Real part: [8, 15], Imaginary part: [2j, 5j]

Correct answer is: a) Real part: [6, 10], Imaginary part: [2, 5]
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with complex numbers: [6+2j, 10+5j]. The `real` attribute of the complex array `x` gives the real parts of the complex numbers, and the `imag` attribute gives the imaginary parts.

16). What is the output of the following code?

				
					import numpy as np
x = np.array([56, 18, 28, 36])
y = np.array([76, 36, 56])
print(np.intersect1d(x, y))

				
			

a) [56, 18, 28, 36]
b) [56, 36]
c) [18, 28, 76]
d) [76, 18, 28]

Correct answer is: b) [56, 36]
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays, `x` and `y`, with the elements [56, 18, 28, 36] and [76, 36, 56] respectively. The `np.intersect1d()` function is then used to find the intersection of the elements between the arrays `x` and `y`.

17). What is the output of the following code?

				
					import numpy as np
x = np.array([25, 33, 10, 45, 33, 10])
print(np.unique(x))
				
			

a) [10, 25, 33, 45]
b) [10, 33, 45]
c) [25, 33, 10, 45]
d) [25, 33, 10]

Correct answer is: a) [10, 25, 33, 45]
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [25, 33, 10, 45, 33, 10]. The `np.unique()` function is then used to find the unique elements in the array `x`.

18). What is the output of the following code?

				
					import numpy as np
x = np.array([56, 18, 28, 36])
y = np.array([76, 36, 56])

print(np.setdiff1d(x, y))
				
			

a) [56, 18, 28, 36]
b) [18, 28]
c) [76]
d) [18, 28, 76]

Correct answer is: b) [18, 28]
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays, `x` and `y`, with the elements [56, 18, 28, 36] and [76, 36, 56], respectively. The `np.setdiff1d()` function is then used to find the set difference between the arrays `x` and `y`. The set difference between two arrays contains the elements that are present in the first array but not in the second array.

19). What is the output of the following code?

				
					import numpy as np
x = np.array([56, 18, 28, 36])
y = np.array([76, 36, 56, 90])

print(np.union1d(x, y))
				
			

a) [18, 28, 36, 56, 76, 90]
b) [56, 18, 28, 36, 76, 90]
c) [56, 18, 28, 36]
d) [18, 28, 36, 76, 90]

Correct answer is: a) [18, 28, 36, 56, 76, 90]
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays, `x` and `y`, with the elements [56, 18, 28, 36] and [76, 36, 56, 90] respectively. The `np.union1d()` function is then used to find the unique values that are in either of the arrays. The union of `x` and `y` will contain all the unique elements present in both arrays, without any duplicates. The output will be a new sorted 1-dimensional array with these unique elements.

20). What is the output of the following code?

				
					import numpy as np
x = np.array([76, 36, 56, 90])
print("Index of maximum Values: ", np.argmax(x))
				
			

a) 0
b) 1
c) 2
d) 3

Correct answer is: d) 3
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [76, 36, 56, 90]. The `np.argmax()` function is then used to find the index of the maximum value in the array `x`.

21). What is the output of the following code?

				
					import numpy as np
x = np.array([76, 36, 56, 90])
print("Index of maximum Values: ", np.argmin(x))
				
			

a) 1
b) 2
c) 3
d) 4

Correct answer is: b) 2
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [76, 36, 56, 90]. The `np.argmin()` function is then used to find the index of the minimum value in the array `x`.

22). What is the output of the following code?

				
					import numpy as np
x = np.array([[4, 8, 7], [2, 3, 6]])
print("Fifth element: ", x[1, 1])
				
			

a) 4
b) 8
c) 3
d) 6

Correct answer is: c) 3
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[4, 8, 7], [2, 3, 6]]. In NumPy arrays, indexing starts from 0. The expression `x[1, 1]` accesses the element at the second row and second column of the array `x`.

23). What is the output of the following code?

				
					
import numpy as np
x = np.zeros((2, 1, 3))
print("After removing single-dimensional entries: ", np.squeeze(x).shape)
				
			

a) (2, 1, 3)
b) (2, 3)
c) (1, 3)
d) (3,)

Correct answer is: b) (2, 3)
Explanation: The given code imports the NumPy library and creates a 3-dimensional NumPy array `x` with the shape (2, 1, 3) filled with zeros. The `np.squeeze()` function is then used to remove single-dimensional entries from the array `x`. The `np.squeeze()` function removes any dimensions from the array that have a size of 1. In this case, the second dimension has a size of 1, so it is removed from the array. Before squeezing, the shape of `x` is (2, 1, 3), which means it has 2 elements along the first dimension, 1 element along the second dimension, and 3 elements along the third dimension. After squeezing, the shape becomes (2, 3) because the second dimension with a size of 1 is removed. Therefore, the correct answer is (2, 3).

24). What is the output of the following code?

				
					import numpy as np
x = np.array((3, 8, 5))
y = np.array((4, 0, 7))
z = np.column_stack((x, y))
print(z)
				
			

a) [[3, 4], [8, 0], [5, 7]]
b) [[3, 8, 5], [4, 0, 7]]
c) [[3, 8], [4, 0], [5, 7]]
d) [[4, 3], [0, 8], [7, 5]]

Correct answer is: a) [[3, 4], [8, 0], [5, 7]]
Explanation: The given code imports the NumPy library and creates two 1-dimensional NumPy arrays `x` and `y` with the elements (3, 8, 5) and (4, 0, 7) respectively. Then, the `np.column_stack()` function is used to stack the arrays `x` and `y` column-wise, forming a new 2-dimensional array `z`.

25). What is the output of the following code?

				
					import numpy as np
x = np.arange(1, 11)
print("Original array:", x)
print("After splitting:")
print(np.split(x, [2, 5]))
				
			

a) Original array: [1 2 3 4 5 6 7 8 9 10]
After splitting: [array([1, 2]), array([3, 4, 5]), array([ 6, 7, 8, 9, 10])]

b) Original array: [1 2 3 4 5 6 7 8 9 10]
After splitting: [array([1, 2]), array([3, 4, 5, 6]), array([7, 8, 9, 10])]

c) Original array: [1 2 3 4 5 6 7 8 9 10]
After splitting: [array([1, 2]), array([3, 4, 5]), array([6, 7, 8, 9, 10])]

d) Original array: [1 2 3 4 5 6 7 8 9 10]
After splitting: [array([1, 2]), array([3, 4]), array([5, 6, 7, 8, 9, 10])]

Correct answer is: a) Original array: [1 2 3 4 5 6 7 8 9 10]
After splitting: [array([1, 2]), array([3, 4, 5]), array([ 6, 7, 8, 9, 10])]
Explanation: The given code imports the NumPy library and creates a 1-dimensional NumPy array `x` with the elements [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. The `np.split()` function is then used to split the array into subarrays. The `np.split(x, [2, 5])` function call splits the array `x` at the indices [2, 5]. It means the array will be split into three subarrays: from index 0 to index 2 (exclusive), from index 2 to index 5 (exclusive), and from index 5 to the end of the array.

NumPy MCQ : Set 4

NumPy MCQ

1). What is the output of the following code?

				
					import numpy as np
x = np.array([6, 8, 3, 5])
print(np.all(x))
				
			

a) True
b) False
c) 0
d) [True, True, True, True]

Correct answer is: b) False
Explanation: The code snippet imports the NumPy library and creates an array `x` with the values [6, 8, 3, 5]. The `np.all()` function is then used to check if all elements in the array are true. However, in NumPy, the value `0` is considered as False, and any non-zero value is considered as True. In this case, the array `x` contains non-zero values (6, 8, 3, 5), so `np.all(x)` will return `True` if all elements in the array are non-zero. Since the array contains zero (`3`), the function will return `False`.

2). What is the output of the following code?

				
					import numpy as np
x = np.array([6, 8, 3, np.inf])
print(np.isfinite(x))
				
			

a) [ True True True False]
b) [ True False True False]
c) [ True True True True]
d) [False False False False]

Correct answer is: a) [True True True False]
Explanation: The given code creates a NumPy array `x` containing four elements: `[6, 8, 3, np.inf]`. The `np.isfinite()` function is applied to the array, which returns a new Boolean array with the same shape as the input array. In the output, `True` represents finite numbers, and `False` represents non-finite numbers (such as `np.inf`).

3). What is the output of the following code?

				
					import numpy as np
x = np.array([2, 4, np.nan, 7])
print(np.isnan(x))
				
			

a) [False, False, False, False]
b) [True, True, True, True]
c) [False, False, True, False]
d) [True, False, True, False]

Correct answer is: c) [False, False, True, False]
Explanation: The given code imports the NumPy library as np and creates a NumPy array ‘x’ with the values [2, 4, np.nan, 7]. The ‘np.isnan(x)’ function checks for NaN (Not a Number) values in the array ‘x’.

4). What is the output of the following code?

				
					import numpy as np
x = np.array([2, 4, 6+9j, 7])
print(np.iscomplex(x))
				
			

a) [False, False, True, False]
b) [True, True, True, True]
c) [False, False, False, False]
d) [True, False, True, False]

Correct answer is: a) [False, False, True, False]
Explanation: The code snippet imports the NumPy library as np and creates an array ‘x’ containing four elements: 2, 4, 6+9j, and 7. The ‘np.iscomplex()’ function is then used to check whether each element in the array ‘x’ is complex or not. The ‘np.iscomplex()’ function returns a Boolean array with the same shape as the input array, where each element is ‘True’ if the corresponding element in the input array is complex, and ‘False’ otherwise.

5). What is the output of the following code?

				
					import numpy as np
x = np.array([2, 4, 6 + 9j, 7])
print(np.isreal(x))
				
			

a) [ True True False True]
b) [ True True True True]
c) [ True True True False]
d) [ True True False False]

Correct answer is: a) [ True True False True]
Explanation: The code creates a NumPy array `x` with four elements: 2, 4, 6+9j (complex number), and 7. The `np.isreal()` function is then applied to this array. The `np.isreal()` function checks if each element in the array is a real number (not a complex number). It returns a Boolean array, where `True` indicates that the element is a real number, and `False` indicates that the element is a complex number.

6). What is the output of the following code?

				
					import numpy as np
x = 8.9
print(np.isscalar(x))

y = [8.9]
print(np.isscalar(y))
				
			

a) True, True
b) False, False
c) True, False
d) False, True

Correct answer is: c) True, False
Explanation: The `np.isscalar(x)` function returns True if the input `x` is a scalar (a single numeric value) and False if it is an array or any other type. In the first case, `x` is assigned the value 8.9, which is a scalar (float), so the output of `np.isscalar(x)` is True. In the second case, `y` is assigned the value `[8.9]`, which is a list containing one element. Lists are not considered scalars in NumPy. Therefore, the output of `np.isscalar(y)` is False.

7). What is the output of the following code?

				
					import numpy as np
x = np.array([3, 8, 5])
y = np.array([3, 8, 6])
print(x == y)
				
			

a) [True, True, True]
b) [False, False, False]
c) [True, True, False]
d) [False, True, True]

Correct answer is: c) [True, True, False]
Explanation: The code snippet creates two NumPy arrays, `x` and `y`, and then performs an element-wise comparison using the `==` operator. The resulting array will have the same shape as the input arrays, and each element in the output will be `True` if the corresponding elements in `x` and `y` are equal and `False` otherwise.

8). What is the output of the following code?

				
					import numpy as np
x = np.array([8, 3])
y = np.array([9, 1])
print(x > y)
				
			

a) [False, False]
b) [True, True]
c) [False, True]
d) [True, False]

Correct answer is: c) [False, True]
Explanation: The code snippet creates two NumPy arrays `x` and `y`, each with two elements. It then applies the comparison `x > y`, which checks element-wise whether the corresponding elements of `x` are greater than the corresponding elements of `y`.

9). What is the output of the following code?

				
					import numpy as np
x = np.array([6, 4])
y = np.array([6, 3])
print(x >= y)
				
			

a) [True, False]
b) [False, True]
c) [True, True]
d) [False, False]

Correct answer is: c) [True, True]
Explanation: The code snippet imports the NumPy library, creates two NumPy arrays ‘x’ and ‘y’, and then prints the result of the comparison ‘x >= y’. The comparison operator ‘>=’ checks if each element of ‘x’ is greater than or equal to the corresponding element in ‘y’. The result of the comparison is a Boolean array that shows the comparison result for each element.

10). What is the output of the following code?

				
					import numpy as np
x = np.array([6, 4])
y = np.array([2, 9])
print(x < y)
				
			

a) [False, True]
b) [True, False]
c) [True, True]
d) [False, False]

Correct answer is: a) [False, True]
Explanation: The given code snippet imports the NumPy library as np and creates two NumPy arrays, x and y. The arrays are [6, 4] and [2, 9], respectively. The statement `x < y` performs element-wise comparison between the elements of arrays x and y.

11). What is the output of the following code?

				
					import numpy as np
x = np.array([10, 34, 86, 26, 56])

print("Size of the array: ", x.size)
print("Memory size of one array element in bytes: ", x.itemsize)
print("Memory size of numpy array in bytes:", x.size * x.itemsize)
				
			

a) Size of the array: 5
Memory size of one array element in bytes: 4
Memory size of numpy array in bytes: 20

b) Size of the array: 5
Memory size of one array element in bytes: 8
Memory size of numpy array in bytes: 40

c) Size of the array: 5
Memory size of one array element in bytes: 16
Memory size of numpy array in bytes: 80

d) Size of the array: 5
Memory size of one array element in bytes: 32
Memory size of numpy array in bytes: 160

Correct answer is: a) Size of the array: 5
Memory size of one array element in bytes: 4
Memory size of numpy array in bytes: 20
Explanation: The given code snippet uses NumPy to create an array `x` with elements [10, 34, 86, 26, 56]. The three print statements then display information about the array.
1. Size of the array: The `x.size` attribute returns the number of elements in the array `x`, which is 5 in this case.
2. Memory size of one array element in bytes: The `x.itemsize` attribute returns the size of one array element in bytes. Since the array contains integer values, the size of each element is 4 bytes in most standard Python installations.
3. Memory size of numpy array in bytes: The memory size of the entire NumPy array can be calculated by multiplying the size of one array element (`x.itemsize`) with the number of elements in the array (`x.size`). In this case, the memory size of the numpy array is 20 bytes (5 elements * 4 bytes per element).

12). What is the output of the following code?

				
					import numpy as np
x = np.ones(3, dtype=int)
print(x)
				
			

a) [1, 1, 1]
b) [1, 1, 1, 1]
c) [1.0, 1.0, 1.0]
d) [1, 1, 1.0]

Correct answer is: a) [1, 1, 1]
Explanation: The code snippet imports the NumPy library as np and creates a NumPy array called `x` using the `np.ones()` function. The `np.ones()` function creates an array of ones with the specified shape. In this case, it creates an array with 3 elements, all set to 1, and the data type is specified as `int`.

13). What is the output of the following code?

				
					import numpy as np
x = np.arange(1, 11)
print("Array: ", x)
				
			

a) Array: [1 2 3 4 5 6 7 8 9 10]
b) [1 2 3 4 5 6 7 8 9 10]
c) [ 2 3 4 5 6 7 8 9 10]
d) Array: [ 1 2 3 4 5 6 7 8 9]

Correct answer is: a) Array: [1 2 3 4 5 6 7 8 9 10]]
Explanation: The code snippet imports the NumPy library as np and then uses np.arange(1, 11) to create a NumPy array `x` with elements starting from 1 up to, but not including, 11. The resulting array `x` is [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. When printing the array using `print(“Array: “, x)`, it will display the array elements without the “Array:” label and in a 1-dimensional format.

14). What is the output of the following code?

				
					import numpy as np
x = np.arange(2, 11, 2)
print("Array of even numbers: ", x)
				
			

a) Array of even numbers: [2, 4, 6, 8, 10]
b) Array of even numbers: [2, 3, 4, 5, 6, 7, 8, 9, 10]
c) Array of even numbers: [1, 2, 3, 4, 5]
d) Array of even numbers: [2, 4, 6, 8]

Correct answer is: a) Array of even numbers: [2, 4, 6, 8, 10]
Explanation: In the code snippet, the NumPy function `np.arange()` is used to generate an array of even numbers starting from 2, incrementing by 2, and ending before 11 (exclusive). The arguments for `np.arange()` are `start`, `stop`, and `step`.

15). What is the output of the following code?

				
					import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x)
				
			

a) [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b) [1, 2, 3, 4, 5, 6, 7, 8, 9]
c) [[1 2 3]
[4 5 6]
[7 8 9]]
d) [[1 4 7]
[2 5 8]
[3 6 9]]

Correct answer is: c) [[1 2 3]
[4 5 6]
[7 8 9]]
Explanation: The code snippet imports the NumPy library as np and creates a 2-dimensional array called x using np.array(). The array contains three rows and three columns with the values:
[[1 2 3]
[4 5 6]
[7 8 9]]

16). What is the output of the following code?

				
					import numpy as np
x = np.identity(3)
print(x)
				
			

a) [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
b) [[0, 1, 0], [1, 0, 1], [0, 1, 0]]
c) [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
d) [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

Correct answer is: a) [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
Explanation: The given code imports the NumPy library and then creates a 3×3 identity matrix using the `np.identity(3)` function. The identity matrix is a square matrix with ones on the main diagonal and zeros elsewhere. For a 3×3 identity matrix, it looks like this:
[[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]

17). What is the purpose of the following code?

				
					from numpy import random
for i in range(5):
    rand_num = random.rand()
    print(rand_num)
				
			

a) To generate an array of 5 random integers between 0 and 1.
b) To generate a random float number between 0 and 1 and print it 5 times.
c) To generate an array of 5 random float numbers between 0 and 1.
d) To generate a random integer between 0 and 1 and print it 5 times.

Correct answer is: c) To generate an array of 5 random float numbers between 0 and 1.
Explanation: The code imports the `random` module from the NumPy library, which provides various functions for generating random numbers. The `random.rand()` function is used to generate random float numbers in the half-open interval [0, 1), meaning that 0 is included, but 1 is excluded. The code then enters a loop that iterates 5 times. In each iteration, the `random.rand()` function generates a new random float number and assigns it to the variable `rand_num`. The `print()` function is used to display this random float number. As a result, the code prints 5 random float numbers between 0 and 1, each on a separate line.

18). What is the purpose of the following code?

				
					import numpy as np
x = np.random.normal(size=5)
print(x)
				
			

a) It generates a random array of size 5 with normally distributed values.
b) It calculates the mean of a 5-element array using the normal distribution.
c) It generates an array of 5 random integers from a normal distribution.
d) It calculates the standard deviation of a 5-element array using the normal distribution.

Correct answer is: a) It generates a random array of size 5 with normally distributed values.
Explanation: The given code utilizes NumPy, a Python library for numerical computations, to achieve its purpose. The `np.random.normal()` function generates a random array of size 5 with values drawn from a normal distribution. The `size` parameter specifies the size of the array to be generated. In the context of this code, the variable `x` is assigned the randomly generated array of size 5. Each element in `x` is a random number sampled from a normal distribution with mean 0 and standard deviation 1, as that is the default behavior of `np.random.normal()`.

19). What is the output of the following code?

				
					import numpy as np
x = np.arange(1, 11)
for val in x:
    if val != 5:
        print(val, end=" ")
				
			

a) 1 2 3 4 5 6 7 8 9 10
b) 1 2 3 4 6 7 8 9 10
c) 1 2 3 4 6 7 8 9
d) 1 2 3 4 6 7 8 9 10 11

Correct answer is: b) 1 2 3 4 6 7 8 9 10
Explanation: The code snippet uses NumPy’s arange() function to create an array `x` with elements from 1 to 10 (inclusive). It then iterates over each element in the array using a for loop. Inside the loop, the condition `if val != 5:` checks if the current value is not equal to 5. If the condition is true, the value is printed using `print(val, end=” “)`.

20). What is the output of the following code?

				
					import numpy as np
x = np.arange(1, 13)
x.reshape(3, 4)
				
			

a) [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
b) [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
c) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
d) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

Correct answer is: a) [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
Explanation: The code snippet imports the NumPy library and creates an array ‘x’ using np.arange(1, 13), which generates an array of integers from 1 to 12 (inclusive of 1, exclusive of 13). The next line, x.reshape(3, 4), reshapes the ‘x’ array into a 2-dimensional array with 3 rows and 4 columns. The elements of the original ‘x’ array are distributed in row-major order to fill the new 3×4 array.

21). What is the output of the following code?

				
					import numpy as np
x = np.arange(1, 16)
x[(x >= 6) & (x <= 10)] *= -1
print(x)
				
			

a) [ 1 2 3 4 5 -6 -7 -8 -9-10 11 12 13 14 15]
b) [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
c) [ 1 2 3 4 5 6 -7 -8 -9-10 11 12 13 14 15]
d) [ 1 2 3 4 5 -6 7 8 9 10 11 12 13 14 15]

Correct answer is: a) [ 1 2 3 4 5 -6 -7 -8 -9-10 11 12 13 14 15]
Explanation: Let’s break down the code step by step: `import numpy as np`: Imports the NumPy library and assigns it the alias ‘np’. `x = np.arange(1, 16)`: Creates a NumPy array ‘x’ containing integers from 1 to 15 (inclusive), excluding 16. The array ‘x’ looks like this: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]. `x[(x >= 6) & (x <= 10)] *= -1`: This line uses Boolean indexing to select the elements of ‘x’ that satisfy the condition (x >= 6) & (x <= 10), i.e., elements greater than or equal to 6 and less than or equal to 10. The selected elements are [6, 7, 8, 9, 10]. Then, it multiplies these selected elements by -1, effectively negating them. `print(x)`: Prints the modified ‘x’ array.

22). What is the output of the following code?

				
					import numpy as np
x = np.array([4, 2, 8])
y = np.array([7, 3, 5])
print(x * y)
				
			

a) [28, 6, 40]
b) [11, 5, 13]
c) [28, 6, 40, 11, 5, 13]
d) [ 28, 6, 40, 7, 3, 5]

Correct answer is: a) [28, 6, 40]
Explanation: The code snippet imports the NumPy library, creates two NumPy arrays x and y, and performs element-wise multiplication between the arrays using the * operator. When two NumPy arrays of the same shape are multiplied element-wise, each element of one array is multiplied by the corresponding element of the other array.

23). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 6, 7],
              [8, 9, 10]])
print("Shape of the matrix: ", x.shape)
				
			

a) Shape of the matrix: (3, 2)
b) Shape of the matrix: (2, 2)
c) Shape of the matrix: (2, 3)
d) Shape of the matrix: (3, 3)

Correct answer is: b) Shape of the matrix: (2, 3)
Explanation: The code defines a NumPy array `x` with two rows and three columns. The `x.shape` attribute returns a tuple representing the dimensions of the array, where the first element is the number of rows and the second element is the number of columns. In this case, the output will be “Shape of the matrix: (2, 3)” since `x` has 2 rows and 3 columns. The correct answer is option b).

24). What is the output of the following code?

				
					import numpy as np
x = np.diag([7, 8])
print(x)
				
			

a) [[7, 0], [0, 8]]
b) [7, 8]
c) [7, 8, 0, 0]
d) [[7], [8]]

Correct answer is: a) [[7, 0], [0, 8]]
Explanation: The code snippet imports the NumPy library and uses the np.diag() function to create a 2-dimensional diagonal array with the elements [7, 8]. The resulting array will have zeros in off-diagonal elements and the given elements on the diagonal. The np.diag() function creates a diagonal matrix from the given input array, placing the elements on the diagonal of the resulting matrix and filling other elements with zeros.

25). What is the output of the following code?

				
					import numpy as np
x = np.array([[5, 3],
              [7, 4]])
print("Sum of all the elements : ", np.sum(x))
				
			

a) 9
b) 14
c) 19
d) 22

Correct answer is: c) 19
Explanation: The given code imports the NumPy library and creates a 2-dimensional NumPy array `x` with the elements [[5, 3], [7, 4]]. The `np.sum()` function is then used to calculate the sum of all elements in the array `x`.