2010-11-06 15 views
8

numpy.unravel_index() bir diziye bir şekil ve düz bir dizin alır ve dizide bu dizini temsil eden bir tuple döndürür. Ters mi var? El ile hesaplayabilirim, ama bu bir yerde yerleşik bir işlev olmalı gibi görünüyor ...NumPy, unravel_index() öğesinin tersine sahip mi?

+1

; Çoğu kişi şu an "NumPy 1.6" veya daha yeni kullanacak. – gerrit

cevap

7

(Mayıs 2011) yerleşik bir NumPy fonksiyonu ravel_multi_index

çoklu endeksine sınır modlarını uygularken, düz endekslerin bir diziye endeksi dizisinin bir demet dönüştürür yoktur.

(Bu aynı zamanda kullanıcı Bi Rico tarafından bir açıklama anlatılan ama gerçekten bir cevap olarak görünmelidir) Sana ravel_multi_index` `kullanarak birine kabul cevabı güncellemek gerektiğini düşünüyorum

2

Yanıt numpy.ndarray.strides dosyasında yatar. Bu işleri http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.strides.html

+1

Güvenilir değil. Dizilerden oluşan dilleri aldığınızda, numpy genellikle aynı verileri paylaşır ve hileleri hızlandırır. Arange (15) .reshape ((3,5)) .strides (bu güzel, bitişik bir dizi olacak) ve arange (35) .reshape ((7,5)) [1 :: 2,:]. . –

+0

Doğru ve bunun görünmezliği gerçek bir acı olabilir. Ama kendiniz (burada olduğum gibi) adım adım hile yapmayı planlıyorsanız, umarız ki dizinin bitişik olduğunu garanti edebilirsiniz. – D0SBoots

3

Bkz:

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

Bir komuta inşa değil, ama her zaman numpy varsayılan satır büyük indeksleme kullanılıyor varsayarak aşağıdaki pasajı kullandım:

np.sum(np.array(index_tuple[:-1])*np.array(a_matrix.shape[1:]))+np.array(index_tuple[-1]) 
fortan benzeri (kolon-ana) indeksleme için

, endeksleri sadece takas edilmesi gerekir:

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

Yukarıda, index_tuple ve a_matrix, sırasıyla indekslenen, ilgilenilen indeksleri ve matrisi içeren bir tuple'dır. Bu, dilimler alındığında adımlarla ilişkili yukarıdaki sorunu içermez. numpy 1.6.0 yana

+2

Sayısal 1,6'dan itibaren "numpy.ravel_multi_index", http://docs.scipy.org/doc/numpy/reference/generated/numpy.ravel_multi_index.html yerleşik bir komuttur, ancak bu soru oldukça eskidir. –

+0

Teşekkürler, yeni komutu fark etmemiştim, bu yüzden bu benim için çok faydalı. –