NumPy - Lặp lại trên mảng
Gói NumPy chứa một đối tượng vòng lặp numpy.nditer. Nó là một đối tượng trình vòng lặp đa chiều hiệu quả bằng cách sử dụng nó có thể lặp lại trên một mảng. Mỗi phần tử của một mảng được truy cập bằng giao diện Iterator tiêu chuẩn của Python.
Hãy để chúng tôi tạo một mảng 3X4 bằng cách sử dụng hàm arange () và lặp lại nó bằng cách sử dụng nditer.
ví dụ 1
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Modified array is:'
for x in np.nditer(a):
print x,
Kết quả của chương trình này như sau:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55
Ví dụ 2
Thứ tự lặp được chọn để phù hợp với bố cục bộ nhớ của một mảng mà không cần xem xét một thứ tự cụ thể. Điều này có thể được nhìn thấy bằng cách lặp lại chuyển vị của mảng trên.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Transpose of the original array is:'
b = a.T
print b
print '\n'
print 'Modified array is:'
for x in np.nditer(b):
print x,
Kết quả của chương trình trên như sau:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Modified array is:
0 5 10 15 20 25 30 35 40 45 50 55
Thứ tự lặp lại
Nếu các phần tử giống nhau được lưu trữ bằng cách sử dụng thứ tự kiểu F, trình vòng lặp sẽ chọn cách hiệu quả hơn để lặp qua một mảng.
ví dụ 1
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Transpose of the original array is:'
b = a.T
print b
print '\n'
print 'Sorted in C-style order:'
c = b.copy(order = 'C')
print c
for x in np.nditer(c):
print x,
print '\n'
print 'Sorted in F-style order:'
c = b.copy(order = 'F')
print c
for x in np.nditer(c):
print x,
Đầu ra của nó sẽ như sau:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Transpose of the original array is:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
Sorted in C-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 20 40 5 25 45 10 30 50 15 35 55
Sorted in F-style order:
[[ 0 20 40]
[ 5 25 45]
[10 30 50]
[15 35 55]]
0 5 10 15 20 25 30 35 40 45 50 55
Ví dụ 2
Có thể buộc nditer đối tượng sử dụng một đơn đặt hàng cụ thể bằng cách đề cập rõ ràng đến nó.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Sorted in C-style order:'
for x in np.nditer(a, order = 'C'):
print x,
print '\n'
print 'Sorted in F-style order:'
for x in np.nditer(a, order = 'F'):
print x,
Đầu ra của nó sẽ là -
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Sorted in C-style order:
0 5 10 15 20 25 30 35 40 45 50 55
Sorted in F-style order:
0 20 40 5 25 45 10 30 50 15 35 55
Sửa đổi giá trị mảng
Các nditer đối tượng có một tham số tùy chọn khác được gọi là op_flags. Giá trị mặc định của nó là chỉ đọc, nhưng có thể được đặt ở chế độ chỉ đọc-ghi hoặc chỉ ghi. Điều này sẽ cho phép sửa đổi các phần tử mảng bằng cách sử dụng trình lặp này.
Thí dụ
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
for x in np.nditer(a, op_flags = ['readwrite']):
x[...] = 2*x
print 'Modified array is:'
print a
Đầu ra của nó như sau:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
[[ 0 10 20 30]
[ 40 50 60 70]
[ 80 90 100 110]]
Vòng lặp bên ngoài
Hàm tạo lớp nditer có ‘flags’ , có thể nhận các giá trị sau:
Sr.No. | Mô tả về Thông Số |
---|---|
1 | c_index Chỉ mục C_order có thể được theo dõi |
2 | f_index Chỉ mục Fortran_order được theo dõi |
3 | multi-index Có thể theo dõi loại chỉ mục có một chỉ mục cho mỗi lần lặp lại |
4 | external_loop Khiến các giá trị được cung cấp là mảng một chiều có nhiều giá trị thay vì mảng không chiều |
Thí dụ
Trong ví dụ sau, các mảng một chiều tương ứng với mỗi cột được duyệt qua bởi trình vòng lặp.
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'Original array is:'
print a
print '\n'
print 'Modified array is:'
for x in np.nditer(a, flags = ['external_loop'], order = 'F'):
print x,
Kết quả như sau:
Original array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Modified array is:
[ 0 20 40] [ 5 25 45] [10 30 50] [15 35 55]
Lặp lại phát sóng
Nếu hai mảng là broadcastable, một kết hợp nditerđối tượng có thể lặp lại chúng đồng thời. Giả sử rằng một mảnga có thứ nguyên 3X4 và có một mảng khác b của thứ nguyên 1X4, trình lặp kiểu sau được sử dụng (mảng b được phát tới kích thước của a).
Thí dụ
import numpy as np
a = np.arange(0,60,5)
a = a.reshape(3,4)
print 'First array is:'
print a
print '\n'
print 'Second array is:'
b = np.array([1, 2, 3, 4], dtype = int)
print b
print '\n'
print 'Modified array is:'
for x,y in np.nditer([a,b]):
print "%d:%d" % (x,y),
Đầu ra của nó sẽ như sau:
First array is:
[[ 0 5 10 15]
[20 25 30 35]
[40 45 50 55]]
Second array is:
[1 2 3 4]
Modified array is:
0:1 5:2 10:3 15:4 20:1 25:2 30:3 35:4 40:1 45:2 50:3 55:4