如何在 numpy 中迭代时删除行
How to remove rows while iterating in numpy
如何像 Java 那样在 numpy 中迭代时删除行:
Iterator < Message > itMsg = messages.iterator();
while (itMsg.hasNext()) {
Message m = itMsg.next();
if (m != null) {
itMsg.remove();
continue;
}
}
这是我的伪代码。迭代时删除条目全部为 0 和 1 的行。
#! /usr/bin/env python
import numpy as np
M = np.array(
[
[0, 1 ,0 ,0],
[0, 0, 1, 0],
[0, 0, 0, 0], #remove this row whose entries are all 0
[1, 1, 1, 1] #remove this row whose entries are all 1
])
it = np.nditer(M, order="K", op_flags=['readwrite'])
while not it.finished :
row = it.next() #how to get a row?
sumRow = np.sum(row)
if sumRow==4 or sumRow==0 : #remove rows whose entries are all 0 and 1 as well
#M = np.delete(M, row, axis =0)
it.remove_axis(i) #how to get i?
编写好的 numpy
代码需要您以矢量化的方式思考。并非每个问题都有很好的向量化,但对于那些有向量化的问题,您可以很容易地编写干净、快速的代码。在这种情况下,我们可以决定我们想要 remove/keep 哪些行,然后使用它来索引到您的数组中:
>>> 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)
我们可以用|
做一个or
操作:
>>> (M == 0).all(1) | (M == 1).all(1)
array([False, False, True, True], dtype=bool)
我们可以将其用于 select 行:
>>> 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]])
如何像 Java 那样在 numpy 中迭代时删除行:
Iterator < Message > itMsg = messages.iterator();
while (itMsg.hasNext()) {
Message m = itMsg.next();
if (m != null) {
itMsg.remove();
continue;
}
}
这是我的伪代码。迭代时删除条目全部为 0 和 1 的行。
#! /usr/bin/env python
import numpy as np
M = np.array(
[
[0, 1 ,0 ,0],
[0, 0, 1, 0],
[0, 0, 0, 0], #remove this row whose entries are all 0
[1, 1, 1, 1] #remove this row whose entries are all 1
])
it = np.nditer(M, order="K", op_flags=['readwrite'])
while not it.finished :
row = it.next() #how to get a row?
sumRow = np.sum(row)
if sumRow==4 or sumRow==0 : #remove rows whose entries are all 0 and 1 as well
#M = np.delete(M, row, axis =0)
it.remove_axis(i) #how to get i?
编写好的 numpy
代码需要您以矢量化的方式思考。并非每个问题都有很好的向量化,但对于那些有向量化的问题,您可以很容易地编写干净、快速的代码。在这种情况下,我们可以决定我们想要 remove/keep 哪些行,然后使用它来索引到您的数组中:
>>> 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)
我们可以用|
做一个or
操作:
>>> (M == 0).all(1) | (M == 1).all(1)
array([False, False, True, True], dtype=bool)
我们可以将其用于 select 行:
>>> 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]])