这里是 Python 新手,我看过 Filter rows of a numpy array?和文档,但仍然无法弄清楚如何以 python 方式对其进行编码。
示例数组我有:(真实数据是 50000 x 10)
a = numpy.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])
filter = ['a','c']
我需要在 a
中找到所有行,在过滤器中使用 a[:, 1]
。预期结果:
[[2,'a'],[4,'c']]
我目前的代码是这样的:
numpy.asarray([x for x in a if x[1] in filter ])
它工作正常,但我在某处读到它效率不高。什么是正确的 numpy 方法?
编辑:
感谢所有正确答案!不幸的是,我只能将一个标记为已接受的答案。我很惊讶 numpy.in1d
没有出现在谷歌搜索 numpy filter 2d array
中。
最佳答案
您可以使用一个 bool
索引数组,您可以使用 np.in1d
生成它.
您可以在任何 axis
上索引一个 np.ndarray
例如,您想要使用一个 bool
数组来指示是否应包含一个元素。由于您希望沿 axis=0
进行索引,这意味着您希望从最远的索引中进行选择,因此您需要具有长度为行数的一维 np.array
。它的每个元素都将指示是否应包括该行。
获得此信息的一种快速方法是使用 np.in1d
在 a
的第二列。您可以通过 a[:, 1]
获取该列的所有元素。现在你有一个 1D np.array
应该根据你的过滤器检查它的元素。就是这样np.in1d
是为了。
所以完整的代码应该是这样的:
import numpy as np
a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])
filter = np.asarray(['a','c'])
a[np.in1d(a[:, 1], filter)]
或更长的形式:
import numpy as np
a = np.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])
filter = np.asarray(['a','c'])
mask = np.in1d(a[:, 1], filter)
a[mask]
关于Python numpy按条件过滤二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38910258/