繁体   English   中英

numpy结构化数组添加记录

[英]numpy Structured array adding record

我有一个像这样的结构化数组:

a = np.array([(0. , 1. , 2.) , (10. , 11. , 12. )] ,
             dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')])

现在,我想添加记录0(a [0])和记录1(a [1]),得到类似以下内容:(10.,12.,14.)

当我写类似:

a[0] + a[1]

我收到错误消息,告诉我您不能添加两个dtype对象或类似的对象。

因此,我想也许我可以将a [0]设为常规向量,然后执行加法。

但是numpy.array(a [0])与a [0]具有相同的numpy.array(a[0],dtype=np.float64) ,而numpy.array(a[0],dtype=np.float64)也不起作用。

那么,谁能告诉我如何将a [0]转换为常规向量? 请不要告诉我将结构化数组转换为常规数组。 因为我只想提取阵列记录中的一部分并添加。 此外,我真的很想知道如何将像a [0]这样的对象转换为常规向量。

您仅因为a [i]是元组而收到错误,就不能直接添加元组。 您必须访问它们,实现此目标的更Python方式是:

map(sum, zip(*a))

zip函数完全可以满足您的需求,之后您必须根据需要处理每个条目(以sum ,您也可以尝试以下操作:

result = []
for elem in zip(*a):
    result.append(sum(elem))
In [206]: a
Out[206]: 
array([(  0.,   1.,   2.), ( 10.,  11.,  12.)], 
      dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')])

记录是复合numpy dtype对象,显示为元组。

In [207]: type(a[0])
Out[207]: numpy.void
In [208]: a[0].dtype
Out[208]: dtype([('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')])

数组的字段(“列”)是数组,并执行常规的数组数学运算。

In [209]: a['PositionX']
Out[209]: array([  0.,  10.])
In [210]: a['PositionX']+a['PositionY']
Out[210]: array([  1.,  21.])

但是尚未为复合dtype定义数学:

In [211]: a[0]+a[1]
TypeError: ufunc 'add' did not contain a loop with signature matching types dtype([('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')]) ....

如果您允许我将整个数组转换为2d,则可以添加行:

In [213]: a1=np.array(a.tolist())
In [214]: a1
Out[214]: 
array([[  0.,   1.,   2.],
       [ 10.,  11.,  12.]])
In [215]: a1[0]+a1[1]
Out[215]: array([ 10.,  12.,  14.])

还有其他方法可以将结构化数组转换为2d(使用viewastype ),但是此tolist()最易于使用且最一致。 有关更多信息, 访问https://stackoverflow.com/a/43380941/901925

但是要对单个记录进行数学运算,您必须将它们转换为数组或将它们像显示的元组一样对待。

In [218]: np.array(a[0].tolist())
Out[218]: array([ 0.,  1.,  2.])
In [219]: np.array(a[0].tolist())+np.array(a[1].tolist())
Out[219]: array([ 10.,  12.,  14.])

但是您对此数组感到满意,还是希望将其返回a.dtype

In [234]: np.array(tuple(asum), a.dtype)
Out[234]: 
array(( 10.,  12.,  14.), 
      dtype=[('PositionX', '<f8'), ('PositionY', '<f8'), ('PositionZ', '<f8')])

结构化数组的数据必须位于元组或元组列表中。

你必须做同样的dtype ,如果你使用的压缩方法是转换@Mohamed Lakhal显示

In [236]: [i+j for i,j in zip(a[0],a[1])]
Out[236]: [10.0, 12.0, 14.0]
In [237]: np.array(tuple([i+j for i,j in zip(a[0],a[1])]), a.dtype)

尽管Divakar评论的一种view方法可以转换整个数组:

In [227]: a.view('<f8')
Out[227]: array([  0.,   1.,   2.,  10.,  11.,  12.])
In [228]: a.view('<f8').reshape(-1,3)
Out[228]: 
array([[  0.,   1.,   2.],
       [ 10.,  11.,  12.]])

它不适用于记录:

In [229]: a[0].view('<f8')
 ....
ValueError: new type not compatible with array.

这是一个更好的二维数组转换器:

In [239]: a.view('3f8')
Out[239]: 
array([[  0.,   1.,   2.],
       [ 10.,  11.,  12.]])
In [240]: a[0].view('3f8')
Out[240]: array([ 0.,  1.,  2.])
In [241]: a[[0,1]].view('3f8')
Out[241]: 
array([[  0.,   1.,   2.],
       [ 10.,  11.,  12.]])
In [242]: a[[0,1]].view('3f8').sum(axis=0)
Out[242]: array([ 10.,  12.,  14.])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM