2016-10-15 6 views
6

, https://stackoverflow.com/a/40056135/5714445Sayısal yayın nasıl daha hızlı gerçekleştirilir? Aşağıdaki soruda

numpy yayıncılık() np.view ile eşleştirilmiş() np.setdiff1d kullanmaktan daha neredeyse 6x hızlıdır bir çözüm sağlar. Bunu nasıl yapar?

A[~((A[:,None,:] == B).all(-1)).any(1)] kullanarak ve daha da hızlandırır. İlginç, ama yine başka bir soru ortaya çıkarır. Bu daha iyi nasıl gerçekleşir?

+0

Neye kıyasla daha hızlı? – Bakuriu

+0

Benim hatam. Np.view –

+1

ile eşleştirilen np.setdiff1d kullanımıyla karşılaştırıldığında daha hızlıdır Kapsamlı bir cevap değil, ancak 'setdiff1d' sahnelerin arkasında çok sayıda tam sıralama işlemi gerektirirken, yukarıdaki kod satırı bir bellek bloğunu ayırır, doldurur ve ardından azaltır A ile dizinlemek için 1D dizisine. Ancak, '(A [:, Yok ,:] == B)' gibi kodların kullanılması 'A' ve 'B' daha büyük olsun (potansiyel olarak devasa bellek blokları tahsis edilmeli ve doldurulmalıdır) gibi çok verimsiz hale gelir. aslında daha yavaş bir seçenek haline gelir. –

cevap

5

Sorunun ikinci bölümüne cevap vermeye çalışırdım.

Yani, onunla Karşılaştırdığımız gibidir:

A[np.all(np.any((A-B[:, None]), axis=2), axis=0)] (I) 

ve

A[~((A[:,None,:] == B).all(-1)).any(1)] 

ilk birine karşı eşleşen bir bakış açısı ile karşılaştırmak için, böyle ikinci bir yaklaşım aşağı yazabilirim -

A[(((~(A[:,None,:] == B)).any(2))).all(1)]   (II) 

Performans göz önüne alındığında en önemli fark, Birincisi, biz çıkarma olmayan eşleşmeleri alıp .any() ile sıfırları kontrol ediyoruz. Böylece, any(), bir boolean olmayan dtype dizisi dizisinde çalışacak şekilde üretilmiştir. İkinci yaklaşımda, bunun yerine A[:,None,:] == B ile elde edilen bir boole dizisini besliyoruz. Bu kısmında yakın 9x speedup Yani

In [141]: A = np.random.randint(0,9,(1000,1000)) # An int array 

In [142]: %timeit A.any(0) 
1000 loops, best of 3: 1.43 ms per loop 

In [143]: A = np.random.randint(0,9,(1000,1000))>5 # A boolean array 

In [144]: %timeit A.any(0) 
10000 loops, best of 3: 164 µs per loop 

, biz büyük bir avantaj ile any() kullanmak bakınız -

en boolean array vs int d_type üzerinde .any() gerçekleştirdiği nasıl olduğunu görmek için küçük bir çalışma zamanı testi yapalım boole dizileri. Bu, ikinci yaklaşımı daha hızlı hale getirmenin en büyük sebebi oldu.