从numpy结构化数组

时间:2017-03-24 10:12:34

标签: python numpy structured-array

我有一个结构化的numpy数组。

numpy结构与google.protobuf.Timestamp类型匹配。

我需要从所述结构的每个元素中提取seconds int64nanos int32,并将其分配给 real { {1}}结构。

下面我列出了一个脚本,它可以方便地为任何人进行测试(Timestampnumpy需要安装Python模块。

如何摆脱/规避最后列出的protobuf,并将值从TypeError变量中的numpy结构中删除?

Timestamp

免责声明:关于python和numpy数组的核心新手。

1 个答案:

答案 0 :(得分:1)

所以

In [112]: x_values
Out[112]: 
array([(  0,  0), ( 50,  5), (100, 10)], 
      dtype=[('seconds', '<i8'), ('nanos', '<i4')])

除非您需要特殊行为,否则我通常不建议使用nditer。通常只需要对数组进行简单迭代(行数为2d)。但是为了更好地理解正在发生的事情,让我们比较一下迭代方法:

In [114]: for elem in np.nditer(x_values):
     ...:     print(elem, elem.dtype)
     ...:     print(type(elem))   
(0, 0) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.ndarray'>
(50, 5) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.ndarray'>
(100, 10) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.ndarray'>

In [115]: for elem in x_values:
     ...:     print(elem, elem.dtype)
     ...:     print(type(elem))
(0, 0) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.void'>
(50, 5) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.void'>
(100, 10) [('seconds', '<i8'), ('nanos', '<i4')]
<class 'numpy.void'>

相同,但type不同,np.ndarray v。np.void。修改nditer变量更容易。

做同样的事情但是看一个字段:

In [119]: for elem in np.nditer(x_values):
     ...:     print(elem['seconds'], type(elem['seconds']))   
0 <class 'numpy.ndarray'>
50 <class 'numpy.ndarray'>
100 <class 'numpy.ndarray'>

In [120]: for elem in x_values:
     ...:     print(elem['seconds'], type(elem['seconds']))
0 <class 'numpy.int64'>
50 <class 'numpy.int64'>
100 <class 'numpy.int64'>

我没有protobuf代码,但我怀疑

ts2.seconds = elem['seconds']

将在第二次迭代中更好地工作,第二次迭代产生np.int64值。或者添加elem['seconds'].item()