2017-03-27 25 views
0

我使用numpy的和有這樣的陣列,例如:(Python)的計數陣列只有零的無環路

error: 
[[-1. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 
[ 0. -1. 0. 0. 0. 0. 0. 0. 1. 0.] 
[ 1. -1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. -1. 0. 0. 0. 0. 0. 0. 1. 0.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 0. 1.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 0. 1.] 
[-1. 1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 
[-1. 1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 1. -1. 0. 0. 1. 0. 0. 0. 0. 0.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 1. -1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 1. -1. 0. 0. 0. 0. 0. 0. 0. 0.] 
[-1. 0. 0. 0. 0. 0. 0. 0. 1. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

現在我要統計有多少內部陣列只包含零的,但沒有寫一個循環功能。

他們有什麼可能的解決辦法嗎?


我知道我可以使用,用in range(len(error))迭代循環和排走行,並檢查是否np.sum(abs(error[i]))>0,但我希望有一個更好的解決方案。

+0

對於「內部陣列」你的意思是行?只需將行數的絕對值相加,結果等於0意味着所有元素都爲0. –

+0

您有這個公式嗎? – jackjuni

回答

0

您可以嘗試使用np.bincount(data)。

下面的例子:

m = np.array([[0,0,1,2,3,4,0,6]] 
data = np.apply_along_axis(lambda x: np.bincount(x,minlength=2), axis=1, arr=m) 

然後,只需選擇一個你想要的數據,你的情況,數據[0]

1

這將做的工作:

a=np.array([[0.,1.,0.],[-1.,0.,0.],[0.,0.,0.]]) 
np.sum(np.abs(a).sum(axis=1)<1e-5) 

結果是1,並且確實只有一行所有元素都是0。此外,我還包含1e-5作爲誤差項(因爲您的數字是浮點數並且n整數)。

此外,如果你的矩陣a實際上只包括那些剛剛(在你的例子作爲)寫成浮點數整數,你也可以做到以下幾點:

a=np.array([[0.,1.,0.],[-1.,0.,0.],[0.,0.,0.]]) 
a=a.astype(int) 
len(a)-np.count_nonzero(np.abs(a).sum(axis=1)) 

結果是1

0

以下方法給您的是具有所有非零行指數:

In [25]: arr 
Out[25]: 
array([[ 0, 0, 0, 0, -1, 0, 0, 0, 1, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, -1, 0, 0, 0, -1, 0, 0, 0, 0], 
     [ 0, 0, 0, -1, 1, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 1, 0, -1, 0, 0, 0, 0], 
     [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, -1, 0, 0, -1, 0, 0, -1], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], 
     [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], 
     [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

然後使用np.where結合布爾米問及np.sum

In [26]: np.where((arr != 0).sum(axis=1) == 0) 
Out[26]: (array([ 1, 2, 3, 4, 5, 8, 11, 12, 14, 17]),) 
0

如果您正在尋找all 0.sum==0.這是你需要的東西:

a = [[1., 0., 1.], [0., 0., 0.], [-1., 0., 1.]] 

result = len([item for item in a if set(item)==set([0.])])