Python numpy按条件过滤二维数组
这里的Python新手,我已阅读numpy数组的Filter行?和文档,但仍然不知道如何以python方式进行编码。
我有以下示例数组:(实际数据为50000 x 10)
a = numpy.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])
filter = ['a','c']
我需要找到所有行a
与a[:, 1] in filter
。预期结果:
[[2,'a'],[4,'c']]
我当前的代码是这样的:
numpy.asarray([x for x in a if x[1] in filter ])
可以,但是我在某处读到它效率不高。什么是适当的numpy方法呢?
编辑:
感谢您提供所有正确答案!不幸的是,我只能将其中一个标记为可接受的答案。我很惊讶numpy.in1d
Google搜索中没有出现numpy filter
2d array
。
-
您可以使用
bool
可以产生的索引数组np.in1d
。您可以使用所需的
np.ndarray
任意值对a进行索引axis
,例如使用bool
s数组来指示是否应包含元素。由于您要沿索引axis=0
,这意味着您要从最远的索引中进行选择,因此需要具有1D,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]