从记录数组中获取一个元素时给定void

时间:2014-04-16 05:20:07

标签: python csv numpy

说,我有一个记录数组。

RA = array([('professor', 'class1', '1'), ('professor', 'class1', '1'),
       ('professor', 'class1', '0'), ('doctor', 'class3', '1')], 
      dtype=[('f0', 'S25'), ('f1', 'S25'), ('f2', 'S25')])

它的类型是ndarray

type(RA) # <type 'numpy.ndarray'>

现在,如果我们想拍一张唱片:

type(RA[0]) # <type 'numpy.void'>

我知道,根据文档,这是正常行为。

任何人都可以解释,为什么会这样?这里的问题是,当我有一个ndarray时,我可以一次提取多个字段,比如说:

RA[['f1','f2']]

同时,这不会起作用,并会抛出异常:

RA[0][['f1','f2']]

当然,我可以这样做。

type(RA[0:1]) # <type 'numpy.ndarray'>

所以,拿第一条记录:

t = RA[0:1];

然后:

t[['f1','f2']];

这将有效 - 它将返回我一个记录,但使用ndarray类型。

据我了解,此处的切片操作将返回记录数组,而索引操作返回void类型。

所以,问题是:

  1. 为什么会这样?
  2. 如前所述,获取一条记录是否正常?
  3. 谢谢。

1 个答案:

答案 0 :(得分:1)

此行为与Python和Numpy的其余部分一致。

每当你拍摄一些东西时,你应该期望得到与切片对象相同的类型。对于常规python列表(以及元组和字符串)以及所有Numpy数组都是如此。当您索引到一个对象时,您应该期望接收该元素的任何类型。 e.g:

pylist = [0,1,2,3,4,5]
type(pylist[0:1]) # <type 'list'>
type(pylist[0]) # <type 'int'>

nparr = array([0,1,2,3,4,5])
type(nparr[0:1]) # <type 'numpy.ndarray'>
type(nparr[0]) # <type 'numpy.int64'>

因此,您只能执行对您最终使用的类型有效的操作。在numpy.void类型的情况下,它不支持切片,因此这就是您收到异常的原因。实际上,虽然您使用RA[0][['f1','f2']]所做的事情是advanced indexing,但这也不会与numpy.void一起使用。

如果你想要做的是检索&#39; f1&#39;和&#39; f2&#39;然后你可以做第一个元素的字段:

RA[['f1','f2']][0]

你也可以在这里使用切片:

RA[['f1','f2']][0:1]

这是有效的,因为您在Numpy数组上运行,该数组支持高级索引,然后从返回的视图中选择元素(类型为numpy.ndarray)。

我还应该注意,Numpy和本机python对象之间的切片行为并不相同,但它们返回的对象类型是一致的。