如何选择numpy记录数组的一行列的子集?

时间:2014-06-15 17:23:22

标签: python numpy

我理解像x[['col1','col2']]这样的语句可用于从numpy记录数组中选择列。我的问题是如何在记录数组的单行上执行相同的操作。这就是我想做的事情:

Python 2.7.7 (default, Jun  2 2014, 01:41:14)
[...]
IPython 2.1.0 -- An enhanced Interactive Python.
[...]

In [1]: import numpy as np

In [2]: x = np.ones(3, dtype=[('a',float),('b',float),('c',int)])

In [3]: x[['b','c']][0]
Out[3]: (1.0, 1)

In [4]: row0 = x[0]

In [5]: row0['b']
Out[5]: 1.0

In [6]: row0['c']
Out[6]: 1

In [7]: row0[['b','c']]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-7-287722bfeeaa> in <module>()
----> 1 row0[['b','c']]

IndexError: invalid index

我希望最后一个语句给出结果(1.0, 1),但我得到上面显示的错误。如何从row0

中提取指定的列

我真正的应用程序有更多列,我需要哪些列取决于我所在的行,所以我不能在行之前选择列。由于row0[['b','c']]的等价物将被执行多次,我想避免在这里使用python循环。

我的部分问题可能是我不知道row0的数据类型:

In [8]: row0
Out[8]: (1.0, 1.0, 1)

In [9]: row0.dtype
Out[9]: dtype([('a', '<f8'), ('b', '<f8'), ('c', '<i8')])

row0有一个dtype,所以它显然不是一个简单的Python元组。但它似乎也不是一个笨拙的阵列:

In [10]: type(row0)
Out[10]: numpy.void

2 个答案:

答案 0 :(得分:1)

在文档中找不到任何关于以您想要的方式访问记录数组的内容 - 我玩了一下,这似乎有效:

>>> x = np.ones(3, dtype=[('a',float),('b',float),('c',int)])
>>> r = np.array(x[0])
>>> r
array((1.0, 1.0, 1), 
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<i4')])
>>> r[['a','c']]
(1.0, 1)
>>> 

r似乎是对x

的看法
>>> r['a'] = 3
>>> r
array((3.0, 1.0, 1), 
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<i4')])
>>> x
array([(3.0, 1.0, 1), (1.0, 1.0, 1), (1.0, 1.0, 1)], 
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<i4')])

答案 1 :(得分:1)

问题是,当您执行x[0]时,您会获得np.void ndim=0个对象。您可以执行x[0:1]以获取np.ndarray ndim=1对象,该对象将接受列选择:

r0 = x[0:1]
r0[['b', 'c']]
#array([(1.0, 1)],
#      dtype=[('b', '<f8'), ('c', '<i4')])

在这种情况下,您还可以将np.void转换为np.ndarray

r0 = x[0]
r0 = r0.reshape(-1)

将接受列选择。