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

时间:2016-09-14 13:59:51

标签: 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)])

正如您所看到的,字段&#39; f4&#39;是一个矩阵:

In [63]: x['f4']
Out[63]: 
array([[ 1000.,  2000.],
       [ 1000.,  2000.]], dtype=float32)

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

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')])

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

1 个答案:

答案 0 :(得分: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)
然后可以使用

xNewView代替x