Хорошо, я боролся с этим некоторое время, но я нашел способ сделать это, не требуя слишком больших усилий.Я прошу прощения, если этот код "грязный" ....
Давайте начнем с 2D-массива:
mydata = numpy.array([['text1', 1, 'longertext1', 0.1111],
['text2', 2, 'longertext2', 0.2222],
['text3', 3, 'longertext3', 0.3333],
['text4', 4, 'longertext4', 0.4444],
['text5', 5, 'longertext5', 0.5555]])
Итак, мы в итоге получаем 2D-массив с 4 столбцами и 5 строками:
mydata.shape
Out[30]: (5L, 4L)
Чтобы использовать numpy.core.records.arrays - нам нужно предоставить входной аргумент в виде списка массивов, так:
tuple(mydata)
Out[31]:
(array(['text1', '1', 'longertext1', '0.1111'],
dtype='|S11'),
array(['text2', '2', 'longertext2', '0.2222'],
dtype='|S11'),
array(['text3', '3', 'longertext3', '0.3333'],
dtype='|S11'),
array(['text4', '4', 'longertext4', '0.4444'],
dtype='|S11'),
array(['text5', '5', 'longertext5', '0.5555'],
dtype='|S11'))
Это создает отдельный массив для каждой строкиданные, НО, нам нужно, чтобы входные массивы были по столбцам, поэтому нам понадобится:
tuple(mydata.transpose())
Out[32]:
(array(['text1', 'text2', 'text3', 'text4', 'text5'],
dtype='|S11'),
array(['1', '2', '3', '4', '5'],
dtype='|S11'),
array(['longertext1', 'longertext2', 'longertext3', 'longertext4',
'longertext5'],
dtype='|S11'),
array(['0.1111', '0.2222', '0.3333', '0.4444', '0.5555'],
dtype='|S11'))
Наконец, это должен быть список массивов, а не кортеж, поэтому мы оборачиваем вышеупомянутое в список (), как показано ниже:
list(tuple(mydata.transpose()))
Это наш отсортированный аргумент ввода данных .... следующий - тип dtype:
mydtype = numpy.dtype([('My short text Column', 'S5'),
('My integer Column', numpy.int16),
('My long text Column', 'S11'),
('My float Column', numpy.float32)])
mydtype
Out[37]: dtype([('My short text Column', '|S5'), ('My integer Column', '<i2'), ('My long text Column', '|S11'), ('My float Column', '<f4')])
Хорошо, теперь мы можем передать это numpy.core.records.array ():
myRecord = numpy.core.records.array(list(tuple(mydata.transpose())), dtype=mydtype)
... и скрестив пальцы:
myRecord
Out[36]:
rec.array([('text1', 1, 'longertext1', 0.11110000312328339),
('text2', 2, 'longertext2', 0.22220000624656677),
('text3', 3, 'longertext3', 0.33329999446868896),
('text4', 4, 'longertext4', 0.44440001249313354),
('text5', 5, 'longertext5', 0.5554999709129333)],
dtype=[('My short text Column', '|S5'), ('My integer Column', '<i2'), ('My long text Column', '|S11'), ('My float Column', '<f4')])
Вуаля!Вы можете индексировать по имени столбца следующим образом:
myRecord['My float Column']
Out[39]: array([ 0.1111 , 0.22220001, 0.33329999, 0.44440001, 0.55549997], dtype=float32)
Надеюсь, это поможет, поскольку я потратил столько времени на numpy.asarray, mydata.astype и т. Д., Пытаясь заставить это работать, прежде чем окончательно отработать этот метод.