根据列值过滤numpy ndarray(矩阵)

7
这个问题询问的是如何根据某些列的值筛选一个 NumPy ndarray
我有一个相当大的 NumPy ndarray(300000, 50),我需要根据某些特定列的值对其进行筛选。我使用了 ndtypes,这样我就可以通过名称访问每一列。
第一列名为 category_code,我需要过滤矩阵,只返回 category_code("A", "B", "C") 中的行。
结果需要是另一个 NumPy ndarray,其列仍然可以通过 dtype 名称访问。
这是我现在的做法:
index = numpy.asarray([row['category_code'] in ('A', 'B', 'C') for row in data])
filtered_data = data[index]

列表推导式就像:

list = [row for row in data if row['category_code'] in ('A', 'B', 'C')]
filtered_data = numpy.asarray(list)

由于我最初使用的dtypes不再可访问,所以无法正常工作。

有没有更好/更符合Python风格的方法来实现相同的结果?

可能会像这样:

filtered_data = data.where({'category_code': ('A', 'B','C'})

谢谢!


你的意思应该是在 index = 这一行使用 row['category_code'] 而不是 data['category_code'],对吗? - Danica
我并不认为你需要改进现有的解决方案,其中你(i)构建了一个布尔数组来满足你的条件,并且(ii)使用这个数组来索引你的数据。它干净、可读、高效... 你还想要什么? - Pierre GM
Pierre GM- 这个例子是一个简化版。我实际上想要将其推广到多列值(例如,category_code在这些值之间,col_2在该范围内,col_3不大于X等等)。 - Nicolas M.
2个回答

10
你可以使用基于 NumPy 的 Pandas 库,它具有更普遍有用的 ndarrays 实现:
>>> # import the library
>>> import pandas as PD

创建一些示例数据作为Python字典,其是列名,是作为Python列表的列值;每个列一个键/值对。
>>> data = {'category_code': ['D', 'A', 'B', 'C', 'D', 'A', 'C', 'A'], 
            'value':[4, 2, 6, 3, 8, 4, 3, 9]}

>>> # convert to a Pandas 'DataFrame'
>>> D = PD.DataFrame(data)

为了仅返回类别代码为B或C的行,概念上需要两个步骤,但可以轻松地在一行中完成:
>>> # step 1: create the index 
>>> idx = (D.category_code== 'B') | (D.category_code == 'C')

>>> # then filter the data against that index:
>>> D.ix[idx]

        category_code  value
   2             B      6
   3             C      3
   6             C      3

请注意在 Pandas 和其基于的 NumPy 中索引的区别。在 NumPy 中,您只需将索引放在方括号内,用逗号指示要索引的维度,并使用“:”表示您希望在其他维度中获取所有值(列):
>>>  D[idx,:]

在Pandas中,您调用数据帧的ix方法,并将索引放在括号内:
>>> D.loc[idx]

D.ix[idx] 现已弃用(自0.20.0版本起),因此您应该使用 D.loc[idx] 替换最后一行代码。 - Laurent S

2
如果您可以选择,我强烈推荐pandas:它内置了"列索引"以及许多其他功能。它是基于numpy构建的。

看起来非常棒。我要试一试。我将其用作scikit-learn库的输入。它似乎还可以帮助读取csv数据并处理缺失数据。我猜我白白重新实现了一堆东西 :) - Nicolas M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接