(Trong bài này, chúng ta hãy np
được viết tắt cho numpy
.)liệt kê numpy.ndarray trên một tập con thích hợp của các tham số?
Giả sử a
là một (n + k) & # x2011; chiều đối tượng np.ndarray
, đối với một số nguyên n > 1 và k > 1. (IOW, n + k > 3 là giá trị a.ndim
). Tôi muốn liệt kê a
qua số thứ tự n đầu tiên của mình; điều này có nghĩa rằng, tại mỗi lần lặp, các điều tra viên/iterator tạo ra một cặp mà yếu tố đầu tiên là một tuple ii
của n chỉ số, và yếu tố thứ hai là k & # x2011; chiều phụ ndarray
tại a[ii]
.
Cấp, nó không phải là khó khăn để mã hóa một chức năng để làm điều này (trong thực tế, tôi đưa ra một ví dụ về một hàm như dưới đây), nhưng tôi muốn biết điều này:
không
numpy
cung cấp bất kỳ đặc biệt cú pháp hoặc hàm để thực hiện kiểu liệt kê "một phần" này?
(Thông thường, khi tôi muốn để lặp qua một đối tượng đa chiều np.ndarray
, tôi sử dụng np.ndenumerate
, nhưng nó sẽ không giúp đỡ ở đây, bởi vì (như xa như tôi có thể nói) np.ndenumerate
sẽ lặp qua tất cả n + k kích thước)
Giả sử rằng câu trả lời cho câu hỏi trên là có, thì có này theo dõi:.
trường hợp các tham số n để lặp lại không tiếp giáp?
(Trong trường hợp này, yếu tố đầu tiên của cặp trở ở mỗi lần lặp của các điều tra viên/iterator sẽ là một tuple của r > n yếu tố, một số trong đó sẽ là một giá trị đặc biệt biểu thị "tất cả", ví dụ: slice(None)
; phần tử thứ hai của cặp này vẫn sẽ là một số ndarray
dài k.)
Cảm ơn!
Mã bên dưới hy vọng làm rõ đặc tả vấn đề. Chức năng partial_enumerate
làm những gì tôi muốn làm bằng cách sử dụng bất kỳ cấu trúc đặc biệt numpy
nào có sẵn cho mục đích này.Theo định nghĩa của partial_enumerate
là một ví dụ đơn giản đối với trường hợp n = k = 2.
import numpy as np
import itertools as it
def partial_enumerate(nda, n):
"""Enumerate over the first N dimensions of the numpy.ndarray NDA.
Returns an iterator of pairs. The first element of each pair is a tuple
of N integers, corresponding to a partial index I into NDA; the second element
is the subarray of NDA at I.
"""
# ERROR CHECKING & HANDLING OMITTED
for ii in it.product(*[range(d) for d in nda.shape[:n]]):
yield ii, nda[ii]
a = np.zeros((2, 3, 4, 5))
for ii, vv in partial_enumerate(a, 2):
print ii, vv.shape
Mỗi dòng của đầu ra là một "cặp tuples", nơi mà các tuple đầu tiên đại diện cho bộ phận một phần của các tọa độ n trong a
và cột thứ hai biểu thị hình dạng của một phụ đề k & # x2011; chiều của a
tại các tọa độ từng phần đó; (Giá trị của cặp thứ hai này là như nhau cho tất cả các dòng, như mong đợi từ đặn của mảng):
(0, 0) (4, 5)
(0, 1) (4, 5)
(0, 2) (4, 5)
(1, 0) (4, 5)
(1, 1) (4, 5)
(1, 2) (4, 5)
Ngược lại, lặp lại trên np.ndenumerate(a)
trong trường hợp này sẽ cho kết quả trong a.size
lần lặp lại, mỗi quý khách đến thăm một cá nhân ô của a
.
"trường hợp kích thước để lặp lại không tiếp giáp?" Tôi không chắc chắn rằng có thể với một mảng numpy tinh khiết. Toàn bộ mảng được lưu trữ trong một khối bộ nhớ liền kề, không giống như một danh sách python chuẩn. Ví dụ, bạn có nghĩa là một mảng 2D với kết quả của '[row.shape cho hàng trong một]' = '[1,2,1,3, ...]'? – Hooked
"Trong trường hợp này, phần tử đầu tiên của cặp được trả về tại mỗi lần lặp bởi toán tử/bộ lặp sẽ là một bộ gồm các phần tử r> n, một số trong đó sẽ là một giá trị đặc biệt biểu thị" tất cả ", ví dụ slice (None); phần tử thứ hai của cặp này vẫn sẽ là một độ dài của độ dài k. " Điều này không có ý nghĩa với tôi, bởi vì nó tạo ra một thành ngữ không nhất quán. Thay vì bao gồm các chỉ mục mục duy nhất, nó sẽ bao gồm một kết hợp của các chỉ mục đơn và chuỗi các chỉ mục. Do đó, nó sẽ không còn là sự đánh dấu giữa các chỉ số và các mảng phụ; một chỉ mục có thể tham chiếu đến nhiều mảng phụ. – senderle
Tôi tin rằng điều này sẽ dẫn đến một độ dài độ dài k + j trong đó j là số chuỗi (tức là các mục không phải mục đơn) trong bộ lập chỉ mục. – senderle