将(nx2)浮点数组转换为2元组的(nx1)数组

时间:2015-11-12 20:30:45

标签: python arrays numpy casting user-defined-types

我有一个NumPy浮点数组

x = np.array([
    [0.0, 1.0],
    [2.0, 3.0],
    [4.0, 5.0]
    ],
    dtype=np.float32
    )

并且需要将其转换为带有元组dtype的NumPy数组,

y = np.array([
    (0.0, 1.0),
    (2.0, 3.0),
    (4.0, 5.0)
    ],
    dtype=np.dtype((np.float32, 2))
    )

NumPy view很遗憾没有在这里工作:

y = x.view(dtype=np.dtype((np.float32, 2)))
ValueError: new type not compatible with array.

有没有机会在不重复x并复制每一个条目的情况下完成这项工作?

1 个答案:

答案 0 :(得分:1)

这很接近:

setf

In [122]: dt=np.dtype([('x',float,(2,))]) In [123]: y=np.zeros(x.shape[0],dtype=dt) In [124]: y Out[124]: array([([0.0, 0.0],), ([0.0, 0.0],), ([0.0, 0.0],)], dtype=[('x', '<f8', (2,))]) In [125]: y['x']=x In [126]: y Out[126]: array([([0.0, 1.0],), ([2.0, 3.0],), ([4.0, 5.0],)], dtype=[('x', '<f8', (2,))]) In [127]: y['x'] Out[127]: array([[ 0., 1.], [ 2., 3.], [ 4., 5.]]) 有一个复合字段。该字段有2个元素。

或者,您可以定义2个字段:

y

但这就是形状(3,1);重塑:

In [134]: dt=np.dtype('f,f')
In [135]: x.view(dt)
Out[135]: 
array([[(0.0, 1.0)],
       [(2.0, 3.0)],
       [(4.0, 5.0)]], 
      dtype=[('f0', '<f4'), ('f1', '<f4')])

除了显示与In [137]: x.view(dt).reshape(3) Out[137]: array([(0.0, 1.0), (2.0, 3.0), (4.0, 5.0)], dtype=[('f0', '<f4'), ('f1', '<f4')]) 相同的dtype。