2015-08-24 15 views
9

Bir NumPy dizisindeki birçok öğenin dizinlerini aynı anda almanın bir yolu var mı?Aynı anda bir NumPy dizisindeki birkaç öğenin dizinlerini alma

E.g.

import numpy as np 
a = np.array([1, 2, 4]) 
b = np.array([1, 2, 3, 10, 4]) 

ben yani b içinde a her öğenin dizinini bulmak istiyoruz: [0,1,4].

import numpy as np 

a = np.array([1, 2, 4]) 
b = np.array([1, 2, 3, 10, 4]) 

c = np.zeros_like(a) 
for i, aa in np.ndenumerate(a): 
    c[i] = np.where(b==aa)[0] 

print('c: {0}'.format(c)) 

Çıktı:

ben ayrıntılı biraz kullanıyorum çözüm bulmak

c: [0 1 4] 
+1

np.where (np.in1d ​​(b, a)) döndürür (dizi ([0, 1, 4], dtype = int64),). Son örneğe göre http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html. –

cevap

12

Şunları kullanabilirsiniz (ya da bu konuda where) in1d ve nonzero:

>>> np.in1d(b, a).nonzero()[0] 
array([0, 1, 4]) 

Örnek dizileriniz için iyi çalışır, ancak genel olarak ar döndürülmüş dizinlerin ışını, a'daki değerlerin sırasını onurlandırmaz. Bundan sonra ne yapmak istediğinize bağlı olarak sorun olabilir. Bu durumda

, çok daha iyi bir cevap bir @Jaime olan searchsorted kullanarak, here verir: Onlar a göründükleri gibi

>>> sorter = np.argsort(b) 
>>> sorter[np.searchsorted(b, a, sorter=sorter)] 
array([0, 1, 4]) 

Bu değerler için endekslerini döndürür. Örneğin:

a = np.array([1, 2, 4]) 
b = np.array([4, 2, 3, 1]) 

>>> sorter = np.argsort(b) 
>>> sorter[np.searchsorted(b, a, sorter=sorter)] 
array([3, 1, 0]) # the other method would return [0, 1, 3] 
2

Bu numpy-indexed paketini kullanarak basit bir tek kılıftır (uyarı: Ben onun yazarı değilim): uygulanması tamamen vectorized edilir

import numpy_indexed as npi 
idx = npi.indices(b, a) 

, ve bunu üzerinde kontrol sağlıyor Eksik değerlerin ele alınması. Dahası, nd dizileri için de çalışır (örneğin, b'deki satırların indekslerini bulmak).

İlgili konular