python
主页 > 脚本 > python >

Python NumPy教程之遍历数组介绍

2022-08-29 | 佚名 | 点击:

NumPy 包包含一个迭代器对象numpy.nditer。它是一个高效的多维迭代器对象,使用它可以迭代数组。使用 Python 的标准迭代器接口访问数组的每个元素。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 用于遍历数组的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

  

print('Original array is:')

print(a)

print()

  

print('Modified array is:')

  

# 迭代数组

for x in geek.nditer(a):

    print(x)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array is:
0 1 2 3 4 5 6 7 8 9 10 11

选择迭代的顺序以匹配数组的内存布局,而不考虑特定的顺序。这可以通过迭代上述数组的转置来看出。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

# 用于迭代转置的 Python 程序

# array

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

     

print('Original array is:')

print(a)

print() 

     

# 原始数组的转置

b = a.T

     

print('Modified array is:')

for x in geek.nditer(b):

    print(x)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array is:
0 1 2 3 4 5 6 7 8 9 10 11

控制迭代顺序

有时以特定顺序访问数组元素很重要,而与内存中元素的布局无关。nditer 对象提供了一个 order 参数来控制迭代的这一方面。具有上述行为的默认设置是 order='K' 以保持现有顺序。这可以用 order='C' 覆盖 C 订单和 order='F' 用于 Fortran 订单。

代码#1:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 用于使用特定顺序迭代数组的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

  

print('Original array is:')

print(a)

print() 

  

print('Modified array in C-style order:')

  

# 具有 3 行和 4 行的形状数组,以给定的顺序排列数组

for x in geek.nditer(a, order = 'C'):

    print(x)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array in C-style order:
0 1 2 3 4 5 6 7 8 9 10 11

代码#2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 用于使用特定顺序迭代数组的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(0,60,5)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

  

print('Original array is:')

print(a)

print() 

  

print('Modified array in F-style order:')

  

# 以给定顺序迭代数组

for x in geek.nditer(a, order = 'F'):

    print(x)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array in F-style order:
0 4 8 1 5 9 2 6 10 3 7 11

修改数组值

nditer 对象有另一个可选参数,称为op_flags。其默认值为只读,但可以设置为读写或只写模式。这将启用使用此迭代器修改数组元素。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

# 用于修改数组值的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

print('Original array is:')

print(a)

print()

  

# 修改数组值

for x in geek.nditer(a, op_flags = ['readwrite']):

    x[...] = 5*x

print('Modified array is:')

print(a)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array is:
[[ 0 5 10 15]
 [20 25 30 35]
 [40 45 50 55]]

外环:

类nditer构造函数有一个flags参数,可以取以下值

范围 描述
external_loop 导致给定的值是具有多个值的一维数组,而不是零维数组
c_index C_order索引可以被跟踪
f_index 跟踪 Fortran_order 索引
multi-index 可以跟踪每次迭代一个索引的类型

代码#1:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

# 使用外部循环迭代数组值的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

  

print('Original array is:')

print(a)

print() 

  

print('Modified array is:')

for x in geek.nditer(a, flags = ['external_loop'], order = 'C'):

    print(x)

输出:

Original array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Modified array is:
[ 0 1 2 3] [ 4 5 6 7] [8 9 10 11] 

代码#2:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

# 使用 f_index 迭代数组值的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(6)

  

# 具有 2 行和 3 列的形状数组

a = a.reshape(2,3)

  

print('Original array is:')

print(a)

print()

  

# 使用 f_index 参数迭代数组

it = geek.nditer(a, flags=['f_index'])

while not it.finished:

      print("%d <%d>" % (it[0], it.index), end=" ")

      it.iternext()

输出:

Original array is:
[[ 0 1 2]
 [ 3 4 5]]

0 <0> 1 <2> 2 <4> 3 <1> 4 <3> 5 <5>

广播迭代

如果两个数组是可广播的,则组合的nditer对象能够同时对它们进行迭代。假设一个数组a的维度为3X4,并且还有另一个维度为1X4的数组b,则使用以下类型的迭代器(数组b广播到a的大小)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

# 用于迭代数组的 Python 程序

  

import numpy as geek

  

# 使用排列方法创建数组

a = geek.arange(12)

  

# 具有 3 行和 4 列的形状数组

a = a.reshape(3,4)

  

print('First array is:')

print(a)

print() 

  

# 使用数组方法创建第二个数组

print('Second array is:')

b = geek.array([5, 6, 7, 8], dtype = int)

print(b) 

print()

  

print('Modified array is:')

for x,y in geek.nditer([a,b]):

    print("%d:%d" % (x,y))

输出:

First array is:
[[ 0 1 2 3]
 [ 4 5 6 7]
 [ 8 9 10 11]]

Second array is:
[5 6 7 8]

Modified array is:
0:5 1:6 2:7 3:8 4:5 5:6 6:7 7:8 8:5 9:6 10:7 11:8

原文链接:https://juejin.cn/post/7136879847095140383
相关文章
最新更新