NumPy 数组迭代

2024年11月11日 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("Printing array:")
print(a);
print("Iterating over the array:")
for x in np.nditer(a):
    print(x,end=' ')

输出:

Printing array:
[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]
Iterating over the array:
1 2 3 4 2 4 5 6 10 20 39 3 

迭代的顺序不遵循任何特定的顺序,如行优先或列优先。然而,它旨在与数组的存储布局相匹配。

让我们迭代上述示例中给定数组的转置。

示例

import numpy as np
a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])
print("Printing the array:")
print(a)
print("Printing the transpose of the array:")
at = a.T
print(at)

#this will be same as previous 
for x in np.nditer(at):
    print(print("Iterating over the array:")
for x in np.nditer(a):
    print(x,end=' ')

输出:

Printing the array:
[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]
Printing the transpose of the array:
[[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]
1 2 3 4 2 4 5 6 10 20 39 3 

迭代顺序

如我们所知,有两种将值存储到numpy数组中的方式:

  1. F-style顺序
  2. C-style顺序

让我们来看看numpy迭代器如何处理特定的顺序(F或C)的示例。

示例

import numpy as np

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])

print("\nPrinting the array:\n")

print(a)

print("\nPrinting the transpose of the array:\n")
at = a.T

print(at)

print("\nIterating over the transposed array\n")

for x in np.nditer(at):
    print(x, end= ' ')

print("\nSorting the transposed array in C-style:\n")

c = at.copy(order = 'C')

print(c)

print("\nIterating over the C-style array:\n")
for x in np.nditer(c):
    print(x,end=' ')


d = at.copy(order = 'F')

print(d)
print("Iterating over the F-style array:\n")
for x in np.nditer(d):
    print(x,end=' ')

输出:

Printing the array:

[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

Printing the transpose of the array:

[[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]

Iterating over the transposed array

1 2 3 4 2 4 5 6 10 20 39 3 
Sorting the transposed array in C-style:

[[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]

Iterating over the C-style array:

1 2 10 2 4 20 3 5 39 4 6 3 [[ 1  2 10]
 [ 2  4 20]
 [ 3  5 39]
 [ 4  6  3]]
Iterating over the F-style array:

1 2 3 4 2 4 5 6 10 20 39 3 

我们可以在定义迭代器对象本身时提及订单’C’或’F’。考虑以下示例。

示例

import numpy as np

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])

print("\nPrinting the array:\n")

print(a)

print("\nPrinting the transpose of the array:\n")
at = a.T

print(at)

print("\nIterating over the transposed array\n")

for x in np.nditer(at):
    print(x, end= ' ')

print("\nSorting the transposed array in C-style:\n")

print("\nIterating over the C-style array:\n")
for x in np.nditer(at, order = 'C'):
    print(x,end=' ')

输出:

Iterating over the transposed array

1 2 3 4 2 4 5 6 10 20 39 3
Sorting the transposed array in C-style:


Iterating over the C-style array:

1 2 10 2 4 20 3 5 39 4 6 3 

数组值的修改

在迭代过程中,我们无法修改数组元素,因为与迭代器对象关联的op-flag设置为只读。

然而,我们可以将此标志设置为读写或仅写入以修改数组的值。考虑以下示例。

示例

import numpy as np

a = np.array([[1,2,3,4],[2,4,5,6],[10,20,39,3]])

print("\nPrinting the original array:\n")

print(a)

print("\nIterating over the modified array\n")

for x in np.nditer(a, op_flags = ['readwrite']):
    x[...] = 3 * x;
    print(x,end = ' ')

输出:

Printing the original array:

[[ 1  2  3  4]
 [ 2  4  5  6]
 [10 20 39  3]]

Iterating over the modified array

3 6 9 12 6 12 15 18 30 60 117 9 

本文链接:http://so.lmcjl.com/news/17522/

展开阅读全文