迭代数组
面对多维数组,时常会需要使用“迭代”的方式,一次一次重复赋值或取值来操作数组,这篇教学将会介绍 NumPy 里迭代数组的方法。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
迭代数组的方法
NumPy 有下列几种迭代数组的方法:
| 方法 | 说明 |
|---|---|
| 单纯读取 | 使用 Python 的循环进行读取。 |
| numpy.nditer() | 将数组转换成 nditer 对象,快速迭代多维数组内的所有元素。 |
| numpy.ndenumerate() | 回传迭代数组时,该元素的索引值与内容。 |
单纯读取
单纯透过 for 循环,就能读取多维度数组的数据。
import numpy as np
a = np.array([1,2,3,4,5,6])
for i in a:
print(i, end=' ') # 1 2 3 4 5 6
b = np.array([[1,2,3],[4,5,6]])
for i in b:
print(i, end=' ') # [1 2 3] [4 5 6]
for i in b:
for j in i:
print(j, end=' ') # 1 2 3 4 5 6
numpy.nditer()
numpy.nditer() 方法可以将数组转换成 nditer 对象,使用后能快速迭代多维数组内的所有元素,进行更灵活的进行操作,以下方的例子而言,如果要取出三维数组内的元素,需要使用三层 for 循环,但如果将数据转换成 nditer 对象,只需要使用一次 for 循环就能取出全部的数据。
import numpy as np
b = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
for i in b:
for j in i:
for k in j:
print(k, end=' ') # 1 2 3 4 5 6 7 8 使用三次 for 迴圈,一層層取出資料
print()
for i in np.nditer(b):
print(i, end= ' ') # 1 2 3 4 5 6 7 8 只使用一次 for 迴圈
下方的例子,可以快速地取出每个数组元素的第一与第三个项目 (“...”代表所有元素,“::2”表示间隔两个取值)。
import numpy as np
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for i in np.nditer(a[...,::2]):
print(i, end= ' ') # 1 3 4 6 7 9 10 12
nditer 有多个参数可以设定,例如 flags、op_flags、op_dtypes、order...等,透过设定参数的方式可以指定迭代后的数据长相。
详细参数说明参考:numpy.nediter
下方的例子设定 flags 为 ['external_loop'],印出时会将原本两个两个的结果分组。
import numpy as np
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for i in np.nditer(a[...,::2], flags=['external_loop']):
print(i, end= ' ') # [1 3] [4 6] [7 9] [10 12]
下方的例子会按照 C 方式或 F 方式进行排序取值。
import numpy as np
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for i in np.nditer(a[...,::2], order='C'):
print(i, end= ' ') # 1 3 4 6 7 9 10 12
print()
for i in np.nditer(a[...,::2], order='F'):
print(i, end= ' ') # 7 4 10 3 9 6 12
numpy.ndenumerate()
numpy.ndenumerate() 会回传迭代数组时,该元素的索引值,下方的例子会印出这个元素的位置 ( 例如 4 位在 [0,1,0] 的位置 )
import numpy as np
a = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
for i,j in np.ndenumerate(a):
print(i,j)
'''
(0, 0, 0) 1
(0, 0, 1) 2
(0, 0, 2) 3
(0, 1, 0) 4
(0, 1, 1) 5
(0, 1, 2) 6
(1, 0, 0) 7
(1, 0, 1) 8
(1, 0, 2) 9
(1, 1, 0) 10
(1, 1, 1) 11
(1, 1, 2) 12
'''
微信扫码关注
抖音扫码关注