欢迎这位怪蜀黍来到《Python机器学习(四十二)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设置为readwritewrite

示例

复制代码
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
复制代码

 

 posted on   大码王  阅读(649)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

成都

复制代码

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示

目录导航