Numpy中的N维数组(ndarray)
Numpy 中的数组是一个元素表(通常是数字),所有元素类型相同,由正整数元组索引。在 Numpy 中,数组的维数称为数组的秩。给出数组沿每个维的大小的整数元组称为数组的形状。。Numpy 中的数组类称为ndarray。Numpy 数组中的元素可以使用方括号访问,并且可以使用嵌套的 Python 列表进行初始化。
例子 :
[[ 1, 2, 3], [ 4, 2, 5]] Here, rank = 2 (as it is 2-dimensional or it has 2 axes) First dimension(axis) length = 2, second dimension has length = 3 overall shape can be expressed as: (2, 3)
# 演示基本数组特征的 Python 程序 import numpy as np # 创建数组对象 arr = np.array( [[ 1, 2, 3], [ 4, 2, 5]] ) # arr 对象的打印类型 print("Array is of type: ", type(arr)) # 打印数组维度(轴) print("No. of dimensions: ", arr.ndim) # 阵列的打印形状 print("Shape of array: ", arr.shape) # 数组的打印大小(元素总数) print("Size of array: ", arr.size) # 打印数组中元素的类型 print("Array stores elements of type: ", arr.dtype)
输出 :
Array is of type: <class 'numpy.ndarray'> No. of dimensions: 2 Shape of array: (2, 3) Size of array: 6 Array stores elements of type: int64
数组创建
在 NumPy 中有多种创建数组的方法。
- 例如,您可以使用array函数从常规 Python列表或元组创建一个数组。 结果数组的类型是从序列中元素的类型推导出来的。****
通常,数组的元素最初是未知的,但它的大小是已知的。因此,NumPy 提供了几个函数来创建具有初始占位符内容的数组。这些最大限度地减少了增长阵列的必要性,这是一项昂贵的操作。
例如: np.zeros、np.ones、np.full、np.empty 等。
- 为了创建数字序列,NumPy 提供了一个类似于 range 的函数,它返回数组而不是列表。
- arange: 返回给定间隔内均匀分布的值。步长是指定的。
- linspace: 返回给定间隔内均匀分布的值。编号_ 的元素被返回。
重塑数组: 我们可以使用reshape方法来重塑数组。考虑一个形状为 (a1, a2, a3, ..., aN) 的数组。我们可以重新整形并将其转换为另一个形状为 (b1, b2, b3, ..., bM) 的数组。唯一需要的条件是:
- a1 x a2 x a3 … x aN = b1 x b2 x b3 … x bM 。(即数组的原始大小保持不变。)
- 扁平化数组: 我们可以使用扁平化方法将数组的副本折叠成一维。它接受order参数。默认值为“C”(用于行优先顺序)。使用“F”表示列主要顺序。
注意: 数组的类型可以在创建数组时显式定义。
# 演示数组创建技术的 Python 程序 import numpy as np # 从浮点类型的列表创建数组 a = np.array([[1, 2, 4], [5, 8, 7]], dtype = 'float') print ("Array created using passed list:\n", a) # 从元组创建数组 b = np.array((1 , 3, 2)) print ("\nArray created using passed tuple:\n", b) # 创建一个全为零的 3X4 数组 c = np.zeros((3, 4)) print ("\nAn array initialized with all zeros:\n", c) # 创建一个复杂类型的常量值数组 d = np.full((3, 3), 6, dtype = 'complex') print ("\nAn array initialized with all 6s." "Array type is complex:\n", d)
输出 :
Array created using passed list: [[ 1. 2. 4.] [ 5. 8. 7.]] Array created using passed tuple: [1 3 2] An array initialized with all zeros: [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]] An array initialized with all 6s. Array type is complex: [[ 6.+0.j 6.+0.j 6.+0.j] [ 6.+0.j 6.+0.j 6.+0.j] [ 6.+0.j 6.+0.j 6.+0.j]]
数组索引
了解数组索引的基础知识对于分析和操作数组对象很重要。NumPy 提供了许多方法来进行数组索引。
- 切片: 就像 python 中的列表一样,NumPy 数组可以切片。由于数组可以是多维的,因此您需要为数组的每个维度指定一个切片。
- 整数数组索引: 在此方法中,传递列表以对每个维度进行索引。完成对应元素的一对一映射以构造一个新的任意数组。
- 布尔数组索引: 当我们想从数组中选择满足某些条件的元素时使用此方法。
# 在 numpy 中演示索引的 Python 程序 import numpy as np # 一个示例数组 arr = np.array([[-1, 2, 0, 4], [4, -0.5, 6, 0], [2.6, 0, 7, 8], [3, -7, 4, 2.0]]) # 切片数组 temp = arr[:2, ::2] print ("Array with first 2 rows and alternate" "columns(0 and 2):\n", temp) # 整数数组索引示例 temp = arr[[0, 1, 2, 3], [3, 2, 1, 0]] print ("\nElements at indices (0, 3), (1, 2), (2, 1)," "(3, 0):\n", temp) # 布尔数组索引示例 cond = arr > 0 # cond is a boolean array temp = arr[cond] print ("\nElements greater than 0:\n", temp)
输出 :
Array with first 2 rows and alternatecolumns(0 and 2): [[-1. 0.] [ 4. 6.]] Elements at indices (0, 3), (1, 2), (2, 1),(3, 0): [ 4. 6. 0. 3.] Elements greater than 0: [ 2. 4. 4. 6. 2.6 7. 8. 3. 4. 2. ]
基本操作
NumPy 提供了大量的内置算术函数。
- 对单个数组的操作: 我们可以使用重载的算术运算符对数组进行元素操作以创建一个新数组。在 +=、-=、*= 运算符的情况下,将修改现有数组。
# 演示单个数组的基本操作的 Python 程序 import numpy as np a = np.array([1, 2, 5, 3]) # 每个元素加 1 print ("Adding 1 to every element:", a+1) # 从每个元素中减去 3 print ("Subtracting 3 from each element:", a-3) # 将每个元素乘以 10 print ("Multiplying each element by 10:", a*10) # 平方每个元素 print ("Squaring each element:", a**2) # 修改现有数组 a *= 2 print ("Doubled each element of original array:", a) # 数组转置 a = np.array([[1, 2, 3], [3, 4, 5], [9, 6, 0]]) print ("\nOriginal array:\n", a) print ("Transpose of array:\n", a.T)
输出 :
Adding 1 to every element: [2 3 6 4] Subtracting 3 from each element: [-2 -1 2 0] Multiplying each element by 10: [10 20 50 30] Squaring each element: [ 1 4 25 9] Doubled each element of original array: [ 2 4 10 6] Original array: [[1 2 3] [3 4 5] [9 6 0]] Transpose of array: [[1 3 9] [2 4 6] [3 5 0]]
一元运算符:许多一元运算作为 ndarray类的方法提供。这包括 sum、min、max 等。这些函数也可以通过设置轴参数来逐行或逐列应用。
# 在 numpy 中演示一元运算符的 Python 程序 import numpy as np arr = np.array([[1, 5, 6], [4, 7, 2], [3, 1, 9]]) # 数组的最大元素 print ("Largest element is:", arr.max()) print ("Row-wise maximum elements:", arr.max(axis = 1)) # 数组的最小元素 print ("Column-wise minimum elements:", arr.min(axis = 0)) # 数组元素之和 print ("Sum of all array elements:", arr.sum()) # 每行的累积总和 print ("Cumulative sum along each row:\n", arr.cumsum(axis = 1))
输出 :
Largest element is: 9 Row-wise maximum elements: [6 7 9] Column-wise minimum elements: [1 1 2] Sum of all array elements: 38 Cumulative sum along each row: [[ 1 6 12] [ 4 11 13] [ 3 4 13]]
二元运算符: 这些操作适用于数组元素并创建一个新数组。您可以使用所有基本的算术运算符,如 +、-、/、等。如果是 +=、-=、 = 运算符,则会修改现有数组。
# 在 Numpy 中演示二元运算符的 Python 程序 import numpy as np a = np.array([[1, 2], [3, 4]]) b = np.array([[4, 3], [2, 1]]) # 添加数组 print ("Array sum:\n", a + b) # 乘法数组(元素乘法) print ("Array multiplication:\n", a*b) # 矩阵乘法 print ("Matrix multiplication:\n", a.dot(b))
输出:
Array sum: [[5 5] [5 5]] Array multiplication: [[4 6] [6 4]] Matrix multiplication: [[ 8 5] [20 13]]
通用函数 (ufunc): NumPy 提供熟悉的数学函数,例如 sin、cos、exp 等。这些函数还对数组进行元素操作,生成数组作为输出。
注意: 我们上面使用重载运算符所做的所有操作都可以使用 ufunc 完成,例如 np.add、np.subtract、np.multiply、np.divide、np.sum 等。
# 在 numpy 中演示通用函数的 Python 程序 import numpy as np # 创建一个正弦值数组 a = np.array([0, np.pi/2, np.pi]) print ("Sine values of array elements:", np.sin(a)) # exponential values a = np.array([0, 1, 2, 3]) print ("Exponent of array elements:", np.exp(a)) # square root of array values print ("Square root of array elements:", np.sqrt(a))
输出:
Sine values of array elements: [ 0.00000000e+00 1.00000000e+00 1.22464680e-16] Exponent of array elements: [ 1. 2.71828183 7.3890561 20.08553692] Square root of array elements: [ 0. 1. 1.41421356 1.73205081]
数据类型
每个 ndarray 都有一个关联的数据类型 (dtype) 对象。这个数据类型对象(dtype)告诉我们数组的布局。这意味着它为我们提供了以下信息:
- 数据类型(整数、浮点数、Python 对象等)
- 数据大小(字节数)
- 数据的字节顺序(小端或大端)
- 如果数据类型是子数组,它的形状和数据类型是什么。
ndarray的值存储在缓冲区中,可以将其视为连续的内存字节块。所以这些字节将如何被解释由 dtype 对象给出。
每个 Numpy 数组都是一个元素表(通常是数字),所有元素类型相同,由正整数元组索引。每个 ndarray 都有一个关联的数据类型 (dtype) 对象。
此数据类型对象 (dtype) 提供有关数组布局的信息。ndarray 的值存储在缓冲区中,可以将其视为可以由 dtype 对象解释的连续内存字节块。Numpy 提供了大量可用于构造数组的数值数据类型。
在创建数组时,Numpy 会尝试猜测数据类型,但构造数组的函数通常还包含一个可选参数来显式指定数据类型。
# Python Program to create a data type object import numpy as np # np.int16 is converted into a data type object. print(np.dtype(np.int16))
输出:
int16
# Python Program to create a data type object # containing a 32 bit big-endian integer import numpy as np # i4 represents integer of size 4 byte # > represents big-endian byte ordering and # < represents little-endian encoding. # dt is a dtype object dt = np.dtype('>i4') print("Byte order is:",dt.byteorder) print("Size is:",dt.itemsize) print("Data type is:",dt.name)
输出:
Byte order is: > Size is: 4 Name of data type is: int32