Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在numpy中迭代时删除行_Python_Numpy_Matrix_Linear Algebra - Fatal编程技术网

Python 如何在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代码需要你以矢量化的方式思考。并不是每个问题都有很好的矢量化,但是对于那些有矢量化的问题,您可以非常轻松地编写干净快速的代码。在这种情况下,我们可以决定要

如何像Java那样在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]])