9.迭代数组
nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效。
控制参数
nditer 提供了多种控制参数,用于控制迭代的行为。
1.order 参数
order 参数用于指定数组的遍历顺序。默认情况下,nditer 按照 C 风格(行优先)遍历数组。
-
C 风格(行优先): order='C'
-
Fortran 风格(列优先): order='F'
# 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 使用 C 风格遍历数组 for x in np.nditer(arr, order='C'): print(x) # 输出: # 1 # 2 # 3 # 4 # 5 # 6 # 使用 Fortran 风格遍历数组 for x in np.nditer(arr, order='F'): print(x) # 输出: # 1 # 4 # 2 # 5 # 3 # 6
2.flags 参数
flags 参数用于指定迭代器的额外行为。
-
multi_index: 返回每个元素的多维索引。
-
external_loop: 返回一维数组而不是单个元素,减少函数调用的次数,从而提高性能。
# 创建一个三维数组 arr = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) # 使用 nditer 遍历数组并获取多维索引 it = np.nditer(arr, flags=['multi_index']) for x in it: print(f"Element: {x}, Index: {it.multi_index}") # 输出: # Element: 1, Index: (0, 0, 0) # Element: 2, Index: (0, 0, 1) # Element: 3, Index: (0, 1, 0) # Element: 4, Index: (0, 1, 1) # Element: 5, Index: (1, 0, 0) # Element: 6, Index: (1, 0, 1) # Element: 7, Index: (1, 1, 0) # Element: 8, Index: (1, 1, 1) # 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 使用外部循环遍历数组 for x in np.nditer(arr, flags=['external_loop'], order='F'): print(x) # 输出: # [1 4] # [2 5] # [3 6]
3.op_flags 参数
op_flags 参数用于指定操作数的行为。
-
readonly: 只读操作数。
-
readwrite: 读写操作数。
-
writeonly: 只写操作数。
# 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 使用读写操作数遍历数组 for x in np.nditer(arr, op_flags=['readwrite']): x[...] = 2 * x print(arr) # 输出: # [[ 2 4 6] # [ 8 10 12]]
10.数组操作
10.1 数组变维
函数名称 | 函数介绍 |
---|---|
reshape | 在不改变数组元素的条件下,修改数组的形状 |
flat | 返回是一个迭代器,可以用 for 循环遍历其中的每一个元素 |
flatten | 以一维数组的形式返回一份数组的副本,对副本的操作不会影响到原数组 |
ravel | 返回一个连续的扁平数组(即展开的一维数组),与 flatten不同,它返回的是数组视图(修改视图会影响原数组) |
10.1.1 flat
返回一个一维迭代器,用于遍历数组中的所有元素。无论数组的维度如何,ndarray.flat属性都会将数组视为一个扁平化的一维数组,按行优先的顺序遍历所有元素。
语法:
ndarray.flat
案例:
import numpy as np def flat_test(): array_one = np.arange(4).reshape(2,2) print("原数组元素:") for i in array_one: print(i,end=" ") print() print("使用flat属性,遍历数组:") for i in array_one.flat: print(i,end=" ")
10.1.2 flatten()
用于将多维数组转换为一维数组。flatten() 返回的是原数组的一个拷贝,因此对返回的数组进行修改不会影响原数组。
语法:
ndarray.flatten(order='C')
参数
order: 指定数组的展开顺序。
-
'C'
:按行优先顺序展开(默认)。 -
'F'
:按列优先顺序展开。 -
'A'
:如果原数组是 Fortran 连续的,则按列优先顺序展开;否则按行优先顺序展开。 -
'K'
:按元素在内存中的顺序展开。
案例:
import numpy as np # 创建一个二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) # 使用 flatten 方法按行优先顺序展开 flat_arr = arr.flatten(order='C') print(flat_arr) # 输出: # [1 2 3 4 5 6]
1.3 ravel()
用于将多维数组转换为一维数组。与 flatten() 不同,ravel() 返回的是原数组的一个视图(view),而不是拷贝。因此,对返回的数组进行修改会影响原数组。
语法:
ndarray.ravel()
参数
order: 指定数组的展开顺序。
-
'C'
:按行优先顺序展开(默认)。 -
'F'
:按列优先顺序展开。