我想从矩阵中删除所有零,因此将删除包含零的每一行或每一列。 像这样: 输入是这个矩阵:
Paul Tiger;071150885524;0151-19630027
三个零应导致删除行1和3(从零开始的索引)以及列1和2。输出矩阵应为:
np.array([
[1, 2, 3, 4, 5],
[6, 0, 8 ,9,10],
[11,12,13,14,15],
[16, 0, 0,19,20]])
到目前为止,我已经尝试过:
np.array([
[ 1, 4, 5],
[11,14,15]])
答案 0 :(得分:3)
您可以使用np.ix_
来处理索引魔术:
In [26]: arr = np.array([[1,2,3,4,5],[6,0,8,9,10],[11,12,13,14,15],[16,0,0,19,20]])
In [27]: mask = arr != 0
In [28]: arr[np.ix_(mask.all(1), mask.all(0))]
Out[28]:
array([[ 1, 4, 5],
[11, 14, 15]])
有问题的索引魔术是np.ix_
将布尔数组变成每个轴的正确索引:
In [29]: mask.all(1)
Out[29]: array([ True, False, True, False])
In [30]: mask.all(0)
Out[30]: array([ True, False, False, True, True])
In [31]: np.ix_(mask.all(1), mask.all(0))
Out[31]:
(array([[0],
[2]]), array([[0, 3, 4]]))
这根本不是那么神奇,它确实有效
In [34]: np.arange(len(mask.all(1)))[mask.all(1)]
Out[34]: array([0, 2])
在幕后。
答案 1 :(得分:1)
您的初始方法的问题是,第一个循环会删除所有带有零的行。当您进入第二个循环时,将没有零,也没有关于它们在哪里的线索,因此您无法删除任何列。
在第一个循环中,而不是删除行,而是将所有非零条目设置为NaN
或其他一些“标记”值。然后删除零的每一列。最后,返回并使用NaN
删除行。