章节
- Numpy 介绍
- Numpy 安装
- NumPy ndarray
- NumPy 数据类型
- NumPy 数组创建
- NumPy 基于已有数据创建数组
- NumPy 基于数值区间创建数组
- NumPy 数组切片
- NumPy 广播
- NumPy 数组迭代
- NumPy 位运算
- NumPy 字符串函数
- NumPy 数学函数
- NumPy 统计函数
- NumPy 排序、查找、计数
- NumPy 副本和视图
- NumPy 矩阵库函数
- NumPy 线性代数
NumPy提供了迭代器对象NumPy.nditer
,是一个高效的多维迭代器对象,可以使用它对数组进行迭代,使用Python的标准迭代器接口访问数组元素。
示例
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a); print("\n")
print("数组迭代:")
for x in np.nditer(a):
print(x, end=' ') print("\n")
输出
打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3
我们知道,numpy中的数组排序有两种:
- F(Fortran)风格顺序,列排序
- C(C语言)风格顺序,行排序
默认情况下,迭代顺序通常受数组的内存布局影响,不受特定的数组排序(C风格顺序/F风格顺序)影响。
可以看一下把上面示例中的数组转置后,对其进行迭代时的顺序。
示例
比较数组及其转置数组的迭代顺序:
import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("打印数组:")
print(a)
print("\n") print("打印数组的转置:")
at = a.T
print(at) print("\n数组迭代:")
for x in np.nditer(a):
print(x, end=' ') print("\n") print("\n转置的数组迭代:")
for x in np.nditer(at):
print(x, end=' ') print("\n")
输出
打印数组:
[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]打印数组的转置:
[[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]]数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3转置的数组迭代:
1 2 3 4 2 4 5 6 10 20 39 3
可以看到,这两个迭代顺序是一样的,转置没有影响迭代顺序。
迭代顺序
要强制按F排序或C排序的顺序迭代数组,可在创建迭代对象时显式指定。
示例
import numpy as np a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]]) print("\n打印数组:\n") print(a) print("\n打印数组的转置:\n")
at = a.T print(at) print("\n迭代转置后的数组\n") for x in np.nditer(at):
print(x, end= ' ') print("\n按C风格顺序迭代数组:\n")
for x in np.nditer(at, order = 'C'):
print(x,end=' ')
输出
打印数组:[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]打印数组的转置:[[ 1 2 10]
[ 2 4 20]
[ 3 5 39]
[ 4 6 3]]迭代转置后的数组1 2 3 4 2 4 5 6 10 20 39 3按C风格顺序迭代数组:1 2 10 2 4 20 3 5 39 4 6 3
数组修改
迭代数组时,默认数组值不能修改,因为迭代对象的op-flag
默认被设置为只读。如要可修改,可在创建迭代对象时,把op_flags
设置为readwrite
或write
。
示例
import numpy as np a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]]) print("\n打印原始数组:\n") print(a) print("\n遍历修改后的数组:\n") for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 3 * x;
print(x,end = ' ')
输出
打印原始数组:[[ 1 2 3 4]
[ 2 4 5 6]
[10 20 39 3]]遍历修改后的数组:3 6 9 12 6 12 15 18 30 60 117 9
广播迭代
如果两个数组是可广播的,可以使用组合的nditer对象对它们进行并发迭代。假设一个数组a的维数为3X4,而另一个数组b的维数为1X4,可使用以下类型的迭代器(将数组b广播到a的大小)。
示例
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4) print ('数组a:')
print (a)
print ('\n') print ('数组b:')
b = np.array([1, 2, 3, 4], dtype = int)
print (b)
print ('\n') print ('同时迭代2个可广播的数组:')
for x,y in np.nditer([a,b]):
print ("%d:%d" % (x,y))
输出
数组a:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]数组b:
[1 2 3 4]同时迭代2个可广播的数组:
0:1
5:2
10:3
15:4
20:1
25:2
30:3
35:4
40:1
45:2
50:3
55:4