我理解像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
答案 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)
将接受列选择。