5 数组迭代

4 阅读2分钟

迭代的方法

方法描述
单纯读取使用循环读取
numpy.nditer()将数组转换为 nditer,快速迭代多维数组里面的元素
numpy.ndenumerate()在迭代的时候,返回元素的索引值

简单读取

通过循环,读取多维数组里面的元素

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.ndinter()

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 循环就能取出所有元素

numpy.org/doc/stable/…

下方的例子会按照 C 方式或 F 方式进行排序取值

NumPy 数组在内存中以连续块存储,多维数组的存储顺序有两种:

● C 风格(行优先,C-order):先存储完一行(第一个维度)再存储下一行,即最后一个维度变化最快。

● Fortran 风格(列优先,F-order):先存储完一列(最后一个维度)再存储下一列,即第一个维度变化最快。 具体说明:

  1. order='C'(默认,C 风格行优先) 迭代时按行优先顺序遍历数组,即优先遍历完第一个维度的所有元素,再进入下一个维度,对应内存中 C 语言的存储顺序。
  2. order='F'(Fortran 风格列优先) 迭代时按列优先顺序遍历数组,即优先遍历完最后一个维度的所有元素,再进入上一个维度,对应 Fortran 语言的存储顺序

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
'''