迭代 Numpy 数组
介绍
本指南将向您介绍 NumPy 数组迭代的基础知识。我们还将深入研究迭代器对象nditer及其提供的强大迭代功能。
迭代 NumPy 数组
首先,让我们看看如何在不使用nditer对象的情况下迭代 NumPy 数组。
迭代一维数组
使用For循环迭代一维数组很简单。
A = np.arange(12)
for cell in A:
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
end指定打印值后需要打印的字符。默认情况下,它会打印换行符。
与 C# 和 Java 等编程语言类似,您也可以使用while循环来迭代数组中的元素。例如:
i = 0
while A[i] < A.size:
print(A[i])
i = i+1
if(i==A.size):
break
输出:
0
1
2
3
4
5
6
7
8
9
10
11
A.size返回数组中元素的数量。请注意: for while 循环后面的缩进块以及需要通过语法检查的 if 语句。
迭代二维数组
如果使用相同的语法来迭代二维数组,则将只能迭代一行。
A = np.arange(12).reshape(4,3)
for row in A:
print(row)
输出:
0 1 2]
[3 4 5]
[6 7 8]
[ 9 10 11
要迭代二维数组中的每个单元格,请嵌套for循环。
for row in A:
for cell in row:
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
如果不想写两个for循环,可以使用flatten函数将二维数组展平为一维数组。例如:
for cell in A.flatten():
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
看一下 Nditer 对象
NumPy 提供了一个名为nditer的多维迭代器对象来迭代数组的元素。例如,您可以在上例中使用nditer如下:
for cell in np.nditer(A):
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
Nditer 迭代顺序
您可以使用order参数控制如何使用nditer访问元素。如果将顺序指定为C,则遵循 C 顺序,即水平遍历数组中的元素。如果将顺序指定为F,则遵循 Fortran 顺序,即垂直遍历数组中的元素。
例如,要获取“C”顺序:
for cell in np.nditer(A, order='C'):
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
获取 Fortran 顺序:
for cell in np.nditer(A, order='F'):
print(cell, end=' ')
输出:
0 3 6 9 1 4 7 10 2 5 8 11
默认情况下,nditer遵循顺序“k”,这意味着它遵循与数组的内存布局相匹配的顺序。此默认设置允许它以最短的时间访问元素。为了证明这一点,让我们将矩阵“B”定义为二维矩阵“A”的转置。所以我们有:
A
输出:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
转置矩阵“B”:
B = A.T
B
输出:
array([[ 0, 3, 6, 9],
[ 1, 4, 7, 10],
[ 2, 5, 8, 11]])
因此,如果我们以默认顺序“k”进行迭代,我们应该看到矩阵“A”和“B”的相同输出。
for cell in np.nditer(A):
print(cell, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
for x in np.nditer(B):
print(x, end=' ')
输出:
0 1 2 3 4 5 6 7 8 9 10 11
修改 NumPy 数组
Nditer将数组元素视为只读。因此,如果您尝试修改值,则会遇到错误。
for cell in np.nditer(A):
cell[...] =cell*2
输出:
ValueError: assignment destination is read-only
要在迭代时修改数组,请使用op_flags参数。因此,要更新数组的元素:
for cell in np.nditer(A, op_flags=['readwrite']):
cell[...] =cell*2
A
输出:
array([[ 0, 2, 4],
[ 6, 8, 10],
[12, 14, 16],
[18, 20, 22]])
同时迭代两个数组
要同时迭代两个数组,请将两个数组传递给nditer对象。然后您将得到数组“A”(一个四乘三的二维数组)和数组“S”(一个一维数组对象):
S = np.arange(3)
S
输出:
array([0, 1, 2])
因此,要同时迭代数组“A”和“S”:
for a,s in np.nditer([A,S]):
print(a, s)
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~