Python 如何在numpy中迭代时删除行
如何像Java那样在numpy中迭代时删除行:Python 如何在numpy中迭代时删除行,python,numpy,matrix,linear-algebra,Python,Numpy,Matrix,Linear Algebra,如何像Java那样在numpy中迭代时删除行: IteratoritMsg=messages.Iterator(); while(itMsg.hasNext()){ 消息m=itMsg.next(); 如果(m!=null){ itMsg.remove(); 继续; } } 这是我的伪代码。在迭代时删除条目均为0和1的行。 编写好numpy代码需要你以矢量化的方式思考。并不是每个问题都有很好的矢量化,但是对于那些有矢量化的问题,您可以非常轻松地编写干净快速的代码。在这种情况下,我们可以决定要
IteratoritMsg=messages.Iterator();
while(itMsg.hasNext()){
消息m=itMsg.next();
如果(m!=null){
itMsg.remove();
继续;
}
}
这是我的伪代码。在迭代时删除条目均为0和1的行。
编写好
numpy
代码需要你以矢量化的方式思考。并不是每个问题都有很好的矢量化,但是对于那些有矢量化的问题,您可以非常轻松地编写干净快速的代码。在这种情况下,我们可以决定要删除/保留哪些行,然后使用这些行索引到数组中:
>>> M
array([[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 0],
[1, 1, 1, 1]])
>>> M[~((M == 0).all(1) | (M == 1).all(1))]
array([[0, 1, 0, 0],
[0, 0, 1, 0]])
一步一步地,我们可以将
M
与某个东西进行比较,以生成布尔数组:
>>> M == 0
array([[ True, False, True, True],
[ True, True, False, True],
[ True, True, True, True],
[False, False, False, False]], dtype=bool)
我们可以使用all
查看行或列是否全部为真:
>>> (M == 0).all(1)
array([False, False, True, False], dtype=bool)
我们可以使用|
执行或操作:
>>> (M == 0).all(1) | (M == 1).all(1)
array([False, False, True, True], dtype=bool)
我们可以使用此选项选择行:
>>> M[(M == 0).all(1) | (M == 1).all(1)]
array([[0, 0, 0, 0],
[1, 1, 1, 1]])
但是由于这些是我们想要丢弃的行,我们可以使用~
(NOT)来翻转False
和True
:
>>> M[~((M == 0).all(1) | (M == 1).all(1))]
array([[0, 1, 0, 0],
[0, 0, 1, 0]])
相反,如果我们想保留并非全部1
或全部0
的列,我们只需更改正在处理的轴:
>>> M
array([[1, 1, 0, 1],
[1, 0, 1, 1],
[1, 0, 0, 1],
[1, 1, 1, 1]])
>>> M[:, ~((M == 0).all(axis=0) | (M == 1).all(axis=0))]
array([[1, 0],
[0, 1],
[0, 0],
[1, 1]])
为什么要在迭代过程中删除它?如果要进行大量的删除,这可能会非常慢,因为每次删除一行时,都必须进行一次复制。除非有很好的理由,否则你不应该这样做。@DSM记录我要删除的行的索引,然后在迭代结束时删除它怎么样?@DSM,我的目标是从逻辑矩阵a中获得最大置换矩阵B,这是我描述的。删除条目都是0和1的列怎么样?@QiankunSU:all
的参数是轴。将all(1)
替换为all(axis=0)
,然后使用M[:,~(formula)]
。感谢您提供详细的分步说明。另一方面,如果我们想迭代ndarray的行,是否可以在执行时删除?我想知道它是否会在迭代中引起问题。
>>> M
array([[1, 1, 0, 1],
[1, 0, 1, 1],
[1, 0, 0, 1],
[1, 1, 1, 1]])
>>> M[:, ~((M == 0).all(axis=0) | (M == 1).all(axis=0))]
array([[1, 0],
[0, 1],
[0, 0],
[1, 1]])