numpy结构化数组上的数组数学

时间:2020-06-23 22:05:47

标签: python numpy numpy-ndarray

import numpy as np
arr = np.array([(1,2), (3,4)], dtype=[('c1', float), ('c2', float)])
arr += 3

导致无效的类型升级错误。有没有办法像结构化数组那样具有漂亮的标记列,但仍然能够像简单的dtype=float数组那样进行操作?

或者,有一种简单的方法可以将dtype=float数组转换为结构化数组吗?即

arr = np.array([(1,2), (3,4)], dtype=float)
arr_struc = arr.astype([('c1', float), ('c2', float)])

仅在不广播并且将列与名称匹配的情况下。似乎我不必执行此循环:

arr_struc = np.zeros(2, dtype=[('c1', float), ('c2', float)])
for i,key in enumerate(arr_struc.dtype.names):  arr_struc[key] = arr[i,:]

1 个答案:

答案 0 :(得分:2)

嗯。一种选择,为此使用视图:

width:fit-content

不是最干净的。但这是一个解决方案。

编辑:

是的,不要使用>>> import numpy as np >>> arr = np.array([(1,2), (3,4)], dtype=[('c1', float), ('c2', float)]) >>> view = arr.view(float) >>> view += 3 >>> arr array([(4., 5.), (6., 7.)], dtype=[('c1', '<f8'), ('c2', '<f8')]) >>> view array([4., 5., 6., 7.]) 再次使用视图

astype

您可能需要根据自己的喜好重塑它:

>>> arr = np.array([(1,2), (3,4)], dtype=float)
>>> arr
array([[1., 2.],
       [3., 4.]])
>>> struct = arr.view(dtype=[('c1', float), ('c2', float)])
>>> struct
array([[(1., 2.)],
       [(3., 4.)]], dtype=[('c1', '<f8'), ('c2', '<f8')])
>>> struct.shape
(2, 1)