我有一个记录数组。在
RA = array([('professor', 'class1', '1'), ('professor', 'class1', '1'),
('professor', 'class1', '0'), ('doctor', 'class3', '1')],
dtype=[('f0', 'S25'), ('f1', 'S25'), ('f2', 'S25')])
它的类型是ndarray
^{pr2}$现在,如果我们想录一张唱片:
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类型。在
据我所知,这里的切片操作将返回record数组,而索引操作返回void类型。在
所以,问题是:
谢谢。在
这种行为与Python和Numpy的其余部分是一致的。在
每当你对某个对象进行切片时,你应该期望得到与切片对象相同的类型。对于常规python列表(以及元组和字符串)以及所有Numpy数组都是如此。当您索引到一个对象中时,您应该期望接收到元素的任何类型。e、 g.:
因此,您只能执行那些对您结束的类型有效的操作。在
numpy.void
类型的情况下,它不支持切片,因此您收到异常。虽然,实际上,你用RA[0][['f1','f2']]
做的是advanced indexing,但这对numpy.void
也不起作用。在如果要从第一个元素检索“f1”和“f2”字段,则可以执行以下操作:
^{pr2}$也可以在此处使用切片:
这是因为您在一个支持高级索引的Numpy数组上操作,然后从返回的视图中选择元素(类型为
numpy.ndarray
)。在我还应该注意到,Numpy和原生python对象之间的切片行为是不相同的,但是它们返回的对象类型是一致的。在
相关问题 更多 >
编程相关推荐