将作为矩阵的numpy数组字段值拆分为列向量

sno*_*ard 5 python numpy structured-array

我有以下numpy结构化数组:

x = np.array([(22, 2, -1000000000.0, [1000,2000.0]), (22, 2, 400.0, [1000,2000.0])],
dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f4', '<f4',2)])
Run Code Online (Sandbox Code Playgroud)

如您所见,字段'f4'是一个矩阵:

In [63]: x['f4']
Out[63]: 
array([[ 1000.,  2000.],
       [ 1000.,  2000.]], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

我的最终目标是拥有一个只有矢量的numpy结构化数组.我想知道如何将'f4'分成两个字段('f41'和'f42'),其中每个字段代表矩阵的列.

In [67]: x
Out[67]: 
array([(22, 2, -1000000000.0, 1000.0, 2000.0),
       (22, 2, 400.0, 1000.0, 2000.0)], 
      dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<f4'), ('f41', '<f4'), ('f42', '<f4')])
Run Code Online (Sandbox Code Playgroud)

此外,我想知道是否有可能在使用修改数组的操作或最小化原始数据的复制时实现这一点.

jot*_*asi 3

您可以通过创建数组的新视图(np.view)来完成此操作,该视图不会复制:

import numpy as np

x = np.array([(22, 2, -1000000000.0, [1000,2000.0]),
              (22, 2, 400.0, [1000,2000.0])],
             dtype=[('f1', '<i4'),
                    ('f2', '<i4'),
                    ('f3', '<f4'),
                    ('f4', '<f4', 2)])
xNewView = x.view(dtype=[('f1', '<i4'),
                         ('f2', '<i4'),
                         ('f3', '<f4'),
                         ('f41', '<f4'),
                         ('f42', '<f4')])
print(np.may_share_memory(x, xNewView)) # True
print(xNewView)
# array([(22, 2, -1000000000.0, 1000.0, 2000.0),
#        (22, 2, 400.0, 1000.0, 2000.0)], 
#       dtype=[('f1', '<i4'),  ('f2', '<i4'), ('f3', '<f4'),
#              ('f41', '<f4'), ('f42', '<f4')])

print(xNewView['f41'])           # array([ 1000.,  1000.], dtype=float32)
print(xNewView['f42'])           # array([ 2000.,  2000.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)

xNewView然后可以用来代替x.