Ваш второй массив близок, хотя я бы сделал это с помощью индексации, а не вставки (что медленнее):
In [431]: a = np.zeros(3, dtype='S4, int, int')
In [432]: a[0] = ('a', 2, 3)
In [433]: a[1] = 1
In [434]: a
Out[434]:
array([(b'a', 2, 3), (b'1', 1, 1), (b'', 0, 0)],
dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])
Список кортежей также является хорошим способом создания такого массива:
In [436]: a = np.array([('a',2,3),('b',4,5)], dtype='S4, int, int')
In [437]: a
Out[437]:
array([(b'a', 2, 3), (b'b', 4, 5)],
dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])
Обратите внимание, что форма 1d (n,) с 3 полями.Поля не считаются измерениями.
Доступ к полям осуществляется по имени, а не по номеру столбца:
In [438]: a['f1']
Out[438]: array([2, 4])
Вы создали (2,3) массив и заполнили каждый«грести» с тем же.Вот почему у вас есть повторы, а у меня нет.
Со строкой Юникода dtype (по умолчанию для Py3):
In [439]: a = np.array([('a',2,3),('b',4,5)], dtype='U4, int, int')
In [440]: a
Out[440]:
array([('a', 2, 3), ('b', 4, 5)],
dtype=[('f0', '<U4'), ('f1', '<i8'), ('f2', '<i8')])
In [441]: print(a)
[('a', 2, 3) ('b', 4, 5)]