说,我有一个记录数组。
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类型。
所以,问题是:
谢谢。
答案 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对象之间的切片行为并不相同,但它们返回的对象类型是一致的。