将作为矩阵的 numpy 数组字段值拆分为列向量
Splitting numpy array field values that are matrices into column vectors
我有以下 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)])
如你所见,字段'f4'是一个矩阵:
In [63]: x['f4']
Out[63]:
array([[ 1000., 2000.],
[ 1000., 2000.]], dtype=float32)
我的最终目标是拥有一个只有向量的 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')])
另外我想知道是否有可能在使用就地修改数组的操作或对原始数据进行最少复制的情况下实现这一点。
您可以通过创建数组的新视图 (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
。
我有以下 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)])
如你所见,字段'f4'是一个矩阵:
In [63]: x['f4']
Out[63]:
array([[ 1000., 2000.],
[ 1000., 2000.]], dtype=float32)
我的最终目标是拥有一个只有向量的 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')])
另外我想知道是否有可能在使用就地修改数组的操作或对原始数据进行最少复制的情况下实现这一点。
您可以通过创建数组的新视图 (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
。