Ваш первый массив должен быть составлен с добавлением списка или пониманием списка. Повторное объединение медленнее
In [97]: np.array([[i,0,0] for i in range(4)])
Out[97]:
array([[0, 0, 0],
[1, 0, 0],
[2, 0, 0],
[3, 0, 0]])
С составным dtype:
In [100]: np.array([(i,0,0) for i in range(4)], dtype=dt)
Out[100]:
array([(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0)],
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')])
Обратите внимание на использование dt
и кортежа вместо списка. Данные для структурированного массива должны быть в форме списка кортежей (как и дисплей).
С изменением dtype изменяется форма:
In [101]: _100.shape
Out[101]: (4,)
In [102]: _97.shape
Out[102]: (4, 3)
Добавить массив в структурированный массив, он должен иметь совместимый тип d и форму:
In [104]: np.array([(4,0,0)],dt)
Out[104]:
array([(4, 0, 0)],
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')])
Это массив (1,) с dt
dype.
In [105]: np.concatenate([_100, _104])
Out[105]:
array([(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0), (4, 0, 0)],
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')])
In [106]: _.shape
Out[106]: (5,)
Другой способ создания структурированного массива - начните со списка массивов с правильным типом dtype:
In [107]: alist = [np.array((i,0,0),dt) for i in range(4)]
In [108]: alist
Out[108]:
[array((0, 0, 0),
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')]),
array((1, 0, 0),
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')]),
array((2, 0, 0),
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')]),
array((3, 0, 0),
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')])]
Я использую stack
, чтобы объединить их, так как все 3 имеют 0d, скалярные массивы.
In [109]: np.stack(alist)
Out[109]:
array([(0, 0, 0), (1, 0, 0), (2, 0, 0), (3, 0, 0)],
dtype=[('index', '<i8'), ('#datapoints', '<i8'), ('#pos_labels', '<i8')])