Python numpy按条件过滤二维数组

Ree*_*eed 6 python arrays numpy python-2.7

这里的Python新手,我已阅读numpy数组的Filter行?和文档,但仍然不知道如何以python方式进行编码。

我有示例数组:(实际数据为50000 x 10)

a = numpy.asarray([[2,'a'],[3,'b'],[4,'c'],[5,'d']])
filter = ['a','c']
Run Code Online (Sandbox Code Playgroud)

我需要找到所有行aa[:, 1] in filter。预期结果:

[[2,'a'],[4,'c']]
Run Code Online (Sandbox Code Playgroud)

我当前的代码是这样的:

numpy.asarray([x for x in a if x[1] in filter ])
Run Code Online (Sandbox Code Playgroud)

可以,但是我在某处读到它效率不高。正确的numpy方法是什么?

编辑:

感谢您提供所有正确答案!不幸的是,我只能将其中一个标记为可接受的答案。令我惊讶的numpy.in1d是,在Google搜索中没有出现numpy filter 2d array

jot*_*asi 5

您可以使用bool可以使用np.in1d.

您可以使用例如指示是否应包含元素的s数组来索引np.ndarray任何axis您想要bool的元素。由于要索引沿axis=0,这意味着要从最外索引中进行选择,因此需要具有np.array长度为行数的1D 。它的每个元素都将指示是否应包括该行。

获得它的一种快速方法是np.in1da. 您可以通过 获得该列的所有元素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)]
Run Code Online (Sandbox Code Playgroud)

或以更长的形式:

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]
Run Code Online (Sandbox Code Playgroud)