我有一个结构化的numpy数组。
numpy结构与google.protobuf.Timestamp
类型匹配。
我需要从所述结构的每个元素中提取seconds
int64
和nanos
int32
,并将其分配给 real { {1}}结构。
下面我列出了一个脚本,它可以方便地为任何人进行测试(Timestamp
和numpy
需要安装Python模块。
如何摆脱/规避最后列出的protobuf
,并将值从TypeError
变量中的numpy结构中删除?
Timestamp
免责声明:关于python和numpy数组的核心新手。
答案 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()
。