Python 从对称numpy矩阵中删除所有零行和零列

Python 从对称numpy矩阵中删除所有零行和零列,python,numpy,Python,Numpy,我有一个对称矩阵: >X=np.数组([[2,0,1,0],[0,0,0,0],[1,0,1,0],[0,0,0]) 数组([[2,0,1,0], [0, 0, 0, 0], [1, 0, 1, 0], [0, 0, 0, 0]]) 删除全部为零的行和列的最简洁的方法是什么?这样我就可以: 数组([[2,1], [1, 1]]) 这项作业有没有一个术语,或者是一艘班轮 我尝试了以下方法,但无效: mask = np.all(X == 0, axis=1) X[not(mask),not(ma

我有一个对称矩阵:

>X=np.数组([[2,0,1,0],[0,0,0,0],[1,0,1,0],[0,0,0])
数组([[2,0,1,0],
[0, 0, 0, 0],
[1, 0, 1, 0],
[0, 0, 0, 0]])
删除全部为零的行和列的最简洁的方法是什么?这样我就可以:

数组([[2,1],
[1, 1]])
这项作业有没有一个术语,或者是一艘班轮

我尝试了以下方法,但无效:

mask = np.all(X == 0, axis=1)
X[not(mask),not(mask)]
>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
mask=np.all(X==0,轴=1)
X[非(面具),非(面具)]
>>>回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

这似乎可行,但似乎很愚蠢:

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


这似乎可行,但似乎很愚蠢:

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


你看过什么
np.all
返回的吗?它是一个数组,所以不能简单地“不”它。相反,你可以尝试
np.any
('notall=any'-好的老德摩根):

mask=np.any(X,轴=1)
然后你可以像这样得到你的“过滤”X:

X[mask][:,mask]

请注意,一旦执行此操作,可能会导致新的零填充行和列,因此您可能希望重复此操作几次。

是否查看了
np.all
返回的内容?它是一个数组,所以不能简单地“不”它。相反,你可以尝试
np.any
('notall=any'-好的老德摩根):

mask=np.any(X,轴=1)
然后你可以像这样得到你的“过滤”X:

X[mask][:,mask]
请注意,一旦执行此操作,可能会导致新的零填充行和列,因此您可能希望将此操作重复几次