2012-09-17 118 views
4

是否有可能獲得一個numpy數組中非零元素的長度而不迭代數組或掩蓋數組。速度是計算長度的主要目標。獲取numpy數組中非零元素的數量?

基本上,就像len(array).where(array != 0)

如果它改變了答案,每一行將以零開始。該數組在對角線上用零填充。

回答

12

假設你的意思是非零元素(和非零行不總數)的總數量:

In [12]: a = np.random.randint(0, 3, size=(100,100)) 

In [13]: timeit len(a.nonzero()[0]) 
1000 loops, best of 3: 306 us per loop 

In [14]: timeit (a != 0).sum() 
10000 loops, best of 3: 46 us per loop 

甚至更​​好:

In [22]: timeit np.count_nonzero(a) 
10000 loops, best of 3: 39 us per loop 

這最後一個,count_nonzero,似乎表現良好時,陣列小,太,而sum招與其說是:

In [33]: a = np.random.randint(0, 3, size=(10,10)) 

In [34]: timeit len(a.nonzero()[0]) 
100000 loops, best of 3: 6.18 us per loop 

In [35]: timeit (a != 0).sum() 
100000 loops, best of 3: 13.5 us per loop 

In [36]: timeit np.count_nonzero(a) 
1000000 loops, best of 3: 686 ns per loop 
3

len(np.nonzero(array)[0])

  • np.nonzero返回索引的元組,其長度等於初始陣列中的維數
  • 我們得到的只是沿着所述第一維度與[0]
  • 指數計算與len
  • 其長度
+0

不起作用對我來說:'AttributeError:'元組'對象沒有'sum'' – Renaud

+0

感謝@Renaud,它實際上是越野車,我修好了。 –