2010-11-06 41 views
8

numpy.unravel_index() có hình dạng và chỉ mục phẳng thành một mảng và trả về bộ tuple đại diện cho chỉ mục đó trong mảng. Có một nghịch đảo? Tôi có thể tính toán nó bằng tay, nhưng điều này có vẻ như nó phải là một chức năng được xây dựng trong một nơi nào đó ...NumPy có nghịch đảo của unravel_index() không?

+1

Tôi nghĩ bạn nên cập nhật các câu trả lời được chấp nhận như một trong những sử dụng 'ravel_multi_index'; hầu hết mọi người sẽ sử dụng 'NumPy 1.6' hoặc mới hơn bây giờ. – gerrit

Trả lời

7

Kể từ numpy 1.6.0 (tháng năm 2011) có một built-in chức năng NumPy ravel_multi_index

Chuyển đổi một tuple của mảng chỉ số vào một loạt các chỉ số căn hộ, áp dụng chế độ ranh giới để đa-index.

(Điều này cũng được đề cập trong một chú thích bằng cách sử dụng Bi Rico nhưng thực sự sẽ xuất hiện như một câu trả lời)

2

Câu trả lời nằm trong numpy.ndarray.strides. Xem http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html

+1

Không đáng tin cậy. Khi bạn lấy các mảng của mảng, thường xuyên sẽ thường xuyên chia sẻ cùng một dữ liệu và thực hiện các thủ đoạn sải chân. So sánh arange (15) .reshape ((3,5)) strides (đây sẽ là một mảng đẹp, liền kề) và arange (35) .reshape ((7,5)) [1 :: 2,:]. . –

+0

Đúng, và sự không nhìn vào đó có thể là một nỗi đau thực sự. Nhưng nếu bạn đang lên kế hoạch thực hiện các thủ thuật xáo trộn chính mình (như tôi đã ở đây), hy vọng bạn có thể đảm bảo rằng mảng là tiếp giáp. – D0SBoots

3

này hoạt động:

def ravel_index(pos, shape): 
    res = 0 
    acc = 1 
    for pi, si in zip(reversed(pos), reversed(shape)): 
     res += pi * acc 
     acc *= si 
    return res 
1

Nó không phải là một xây dựng trong lệnh, nhưng tôi đã luôn luôn sử dụng đoạn mã sau đây, giả định mặc định hàng-lớn indexing NumPy đang được sử dụng:

np.sum(np.array(index_tuple[:-1])*np.array(a_matrix.shape[1:]))+np.array(index_tuple[-1]) 

để lập chỉ mục giống như cột (cột chính), các chỉ số chỉ cần được hoán đổi:

np.sum(np.array(index_tuple[1:])*np.array(a_matrix.shape[:-1]))+np.array(index_tuple[0]) 

Ở trên, index_tuple và a_matrix là một tuple chứa các chỉ mục quan tâm và ma trận được lập chỉ mục tương ứng. Điều này không có vấn đề trên liên quan đến các bước tiến khi lát được lấy.

+2

Kể từ 1.6 sumpy nó được xây dựng trong lệnh 'numpy.ravel_multi_index', http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel_multi_index.html nhưng câu hỏi này là khá cũ. –

+0

Cảm ơn, tôi đã không nhận thấy lệnh mới, vì vậy điều này rất hữu ích đối với tôi. –

Các vấn đề liên quan