猿问

如何展平一个numpy结构化数组,其中每个元素本身就是一个numpy数组

我有一个 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')])

如果这更容易实现。


慕尼黑8549860
浏览 161回答 2
2回答

沧海一幻觉

与上面类似,但使用 list 和 zipzarray([(array([1]), array([0.1])),&nbsp; &nbsp; &nbsp; &nbsp;(array([2, 3, 4]), array([0.2, 0.3, 0.4])),&nbsp; &nbsp; &nbsp; &nbsp;(array([5, 6]), array([0.5, 0.6]))],&nbsp; &nbsp; &nbsp; 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)],&nbsp; &nbsp; &nbsp; 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)),...&nbsp; &nbsp;(np.array([2], dtype=np.int32), np.array([0.2], dtype=np.float64)),...&nbsp; &nbsp;(np.array([3], dtype=np.int32), np.array([0.3], dtype=np.float64)),...&nbsp; &nbsp;(np.array([4], dtype=np.int32), np.array([0.4], dtype=np.float64)),...&nbsp; &nbsp;(np.array([5], dtype=np.int32), np.array([0.5], dtype=np.float64)),...&nbsp; &nbsp;(np.array([6], dtype=np.int32), np.array([0.6], dtype=np.float64))],...&nbsp; &nbsp;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']])>>>copyarray([[(1, 0.1)],&nbsp; &nbsp;[(2, 0.2)],&nbsp; &nbsp;[(3, 0.3)],&nbsp; &nbsp;[(4, 0.4)],&nbsp; &nbsp;[(5, 0.5)],&nbsp; &nbsp;[(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)],&nbsp; dtype=[('field_1', '<i4'), ('field_2', '<f8')])
随时随地看视频慕课网APP

相关分类

Python
我要回答