2014-04-21 105 views
2

看來我在這裏錯過了一些非常基本的東西。 我有一個大型的方陣,其中大部分爲零。我想要的是將其縮減爲包含具有非零條目的所有行和列的矩陣。 例如:減少numpy中的稀疏矩陣

1 1 0 1 
1 1 0 1 
0 0 0 0 
1 1 0 1 

應減少到:

1 1 1 
1 1 1 
1 1 1 

有一個快速的方法來做到這一點?

+0

什麼行/列有一些非零和一些零項?保留它們? – nneonneo

+0

是的,如果有非零元素,應該保留。我正在考慮按順序切割不同的軸。第一行全零,然後列全零。 – Manbroski

回答

1

怎麼是這樣的:

>>> arr 
array([[ 1., 1., 0., 1.], 
     [ 1., 1., 0., 1.], 
     [ 0., 0., 0., 0.], 
     [ 1., 1., 0., 1.]]) 

>>> mask = (arr==0) 

arr = arr[~np.all(mask,axis=0)] 
arr = arr[:,~np.all(mask,axis=1)] 
>>> arr 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
+0

這正是我需要的。兩個問題雖然。首先,爲什麼'mask =(arr!= 0)'沒有工作(使用'np.all'和'〜np.all')。其次,什麼是神祕的「〜」? – Manbroski

+1

@Manbroski'〜'是位運算符NOT操作符的快捷方式,參見[這裏](http://docs.scipy.org/doc/numpy/reference/generated/numpy.invert.html)。我會玩'np.all'和不同的面具,看看我爲什麼寫這個手術的原因,我不確定我能否簡單地將其寫入文字。 – Daniel

+0

谷歌特殊字符有點困難,這就是爲什麼我使用它的語義困惑。非常感謝。 – Manbroski