如何展平一个 numpy 结构化数组,其中每个元素本身就是一个 numpy 数组 (dtype='O')



我有一个numpy结构化数组,其中数组中的每个元素本身都是一个numpy数组(dtype='O'(。同一行中的每个元素数组始终具有相同的长度,而不同行中的元素数组可以具有可变长度。例如,它可能看起来像这样:

array([(array([1], dtype=int32),       array([0.1], dtype=float64)),
(array([2, 3, 4], dtype=int32), array([0.2, 0.3, 0.4], dtype=float64)),
(array([5, 6], dtype=int32),    array([0.5, 0.6], dtype=float64))],
dtype=[('field_1', 'O'), ('field_2', 'O')])

展平这样一个数组的最佳方法是什么,以便将元素数组长度 = N 的行扩展为 N 行?理想情况下,我希望扁平化的数组看起来像:

array([(1, 0.1),
(2, 0.2),
(3, 0.3),
(4, 0.4),
(5, 0.5),
(6, 0.6)],
dtype=[('field_1', int32), ('field_2', float64)])

但我也可以处理其他格式,只要扩展长度为>1 的行,例如:

array([(array([1], dtype=int32), array([0.1], dtype=float64)),
(array([2], dtype=int32), array([0.2], dtype=float64)),
(array([3], dtype=int32), array([0.3], dtype=float64)),
(array([4], dtype=int32), array([0.4], dtype=float64)),
(array([5], dtype=int32), array([0.5], dtype=float64)),
(array([6], dtype=int32), array([0.6], dtype=float64))],
dtype=[('field_1', 'O'), ('field_2', 'O')])

如果这在某种程度上更容易实现。

与上述类似,但使用 list 和 zip

z
array([(array([1]), array([0.1])),
(array([2, 3, 4]), array([0.2, 0.3, 0.4])),
(array([5, 6]), array([0.5, 0.6]))],
dtype=[('field_1', 'O'), ('field_2', 'O')])
x = np.concatenate(z['field_1'])
y = np.concatenate(z['field_2'])
dt = np.dtype([('f0', '<i4'), ('f1', 'f8')])
np.asarray(list(zip(x, y)), dtype=dt)
array([(1, 0.1), (2, 0.2), (3, 0.3), (4, 0.4), (5, 0.5), (6, 0.6)],
dtype=[('f0', '<i4'), ('f1', '<f8')])

我不确定这是"最佳"方法,但它可以实现您正在寻找的内容。 我不知道有什么方法可以在没有副本的情况下完全在内存中完成,所以我会从一个空数组开始。

>>>import numpy as np
>>>original = np.array([(np.array([1], dtype=np.int32), np.array([0.1], dtype=np.float64)),
...   (np.array([2], dtype=np.int32), np.array([0.2], dtype=np.float64)),
...   (np.array([3], dtype=np.int32), np.array([0.3], dtype=np.float64)),
...   (np.array([4], dtype=np.int32), np.array([0.4], dtype=np.float64)),
...   (np.array([5], dtype=np.int32), np.array([0.5], dtype=np.float64)),
...   (np.array([6], dtype=np.int32), np.array([0.6], dtype=np.float64))],
...   dtype=[('field_1', '<i4'), ('field_2', '<f8')])
>>>copy = np.empty((6,1), dtype=[('field_1', '<i4'), ('field_2', '<f8')])

然后我们可以连接原始数组中的 2 个字段

>>>copy['field_1'][:,0] = np.concatenate([original['field_1']])
>>>copy['field_2'][:,0] = np.concatenate([original['field_2']])
>>>copy
array([[(1, 0.1)],
[(2, 0.2)],
[(3, 0.3)],
[(4, 0.4)],
[(5, 0.5)],
[(6, 0.6)]], dtype=[('field_1', '<i4'), ('field_2', '<f8')])

最后一步是展平副本

>>>copy.flatten()
array([(1, 0.1), (2, 0.2), (3, 0.3), (4, 0.4), (5, 0.5), (6, 0.6)],
dtype=[('field_1', '<i4'), ('field_2', '<f8')])

最新更新