6

NumPy ndarray这个问题是关于根据某些列值过滤 a 。

我有一个相当大的NumPy ndarray(300000、50),我正在根据某些特定列中的值对其进行过滤。我有ndtypes,所以我可以按名称访问每一列。

第一列已命名category_code,我需要过滤矩阵以仅返回category_codein 中的行("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我原来拥有的不再可访问。

有没有更好/更 Pythonic 的方式来实现相同的结果?

可能看起来像:

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

谢谢!

4

2 回答 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)

要仅返回 category_code 为 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中的索引与构建 Pandas 的库NumPy之间的区别。在 NumPy 中,您只需将索引放在括号内,用“,”指示要索引的维度,并使用“:”表示您想要另一个维度中的所有值(列):

>>>  D[idx,:]

在 Pandas 中,您调用数据框的ix方法,并且将索引放在括号内:

>>> D.loc[idx]
于 2012-08-23T20:57:55.450 回答
2

如果可以选择,我强烈推荐pandas:它内置了“列索引”以及许多其他功能。它建立在 numpy 之上。

于 2012-08-23T20:32:01.703 回答