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

2024-10-05 14:31:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个记录数组。在

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类型。在

所以,问题是:

  1. 为什么会这样?在
  2. 这是一个正常的方式得到一个记录,因为它之前描述?在

谢谢。在


Tags: numpy类型type记录数组arrayf2f1
1条回答
网友
1楼 · 发布于 2024-10-05 14:31:35

这种行为与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也不起作用。在

如果要从第一个元素检索“f1”和“f2”字段,则可以执行以下操作:

^{pr2}$

也可以在此处使用切片:

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

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

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

相关问题 更多 >