龙空技术网

Python机器学习(四十二)NumPy 数组迭代

极目馆主 107

前言:

眼前我们对“python多维数组遍历”都比较注意,朋友们都需要学习一些“python多维数组遍历”的相关文章。那么小编同时在网摘上搜集了一些关于“python多维数组遍历””的相关知识,希望我们能喜欢,你们快快来学习一下吧!

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:15:210:315:420:125:230:335:440:145:250:355:4

标签: #python多维数组遍历