Это моя настройка вашего образца, скорректированная так, чтобы он работал. Обратите внимание, что я перебираю столбцы по имени поля
dt=np.dtype({"names": columns, "formats" : ['i'] + ['int8'] * (len(columns) - 1)})
mat=np.zeros((10,),dtype=dt)
for i in range(1,7,3):
mat[dt.names[i]]=default_age
mat[dt.names[i+1]]=default_height
mat[dt.names[i+2]]=default_shoe_size
производство
array([(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9)],
dtype=[('id', '<i4'), ('collections.ChainMap(np.arange(6).reshape(3,2))[0]_age', 'i1'), ('a_height', 'i1'), ('a_shoe_size', 'i1'), ('b_age', 'i1'), ('b_height', 'i1'), ('b_shoe_size', 'i1')])
Пока количество имен полей значительно меньше, чем количество строк, я думаю, что это будет так же быстро или даже быстрее, чем любой другой способ.
В моем образце x=(10,)
. Ваше выражение mat[:,j+1]
не было исправлено для обработки структурированного массива 1d.
Структурированный массив, вероятно, не лучший способ, если у вас очень много столбцов (полей) (по сравнению с количеством строк).
Если все ваши поля «int», я бы использовал обычный массив 2d. Структурированные массивы наиболее полезны, когда поля имеют разные типы элементов.
Вот способ инициализации обычного массива 2d с этими значениями и, при необходимости, приведения его к структурированному массиву.
values=np.array([2,5,9])
x, y = 10, 2
mat1=np.repeat(np.repeat(values[None,:],y,0).reshape(1,3*y),x,0)
производство:
array([[2, 5, 9, 2, 5, 9],
[2, 5, 9, 2, 5, 9],
...,
[2, 5, 9, 2, 5, 9]])
Добавить в столбец идентификатора
mat1=np.concatenate([np.zeros((x,1),int),mat1],1)
array([[0, 2, 5, 9, 2, 5, 9],
[0, 2, 5, 9, 2, 5, 9],
...
[0, 2, 5, 9, 2, 5, 9],
[0, 2, 5, 9, 2, 5, 9]])
Новый dtype — со всеми простыми «int»:
dt1=np.dtype({"names" : columns, "formats" : ['i'] + ['int'] * (len(columns) - 1)})
mat2=np.empty((x,),dtype=dt1)
Если все сделано правильно, data
для mat1
должен иметь тот же размер и порядок байтов, что и для mat2
. В этом случае я могу «скопировать» его (на самом деле просто изменить указатели).
mat2.data=mat1.data
mat2
выглядит точно так же, как предыдущий mat
, за исключением того, что dtype
немного отличается (с полями i4
вместо i1
)
array([(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9)],
dtype=[('id', '<i4'), ('a_age', '<i4'), ('a_height', '<i4'), ('a_shoe_size', '<i4'), ('b_age', '<i4'), ('b_height', '<i4'), ('b_shoe_size', '<i4')])
Другой способ использовать значения mat1
для инициализации структурированного массива — это промежуточный список кортежей:
np.array([tuple(row) for row in mat1],dtype=dt)
array([(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9), (0, 2, 5, 9, 2, 5, 9),
(0, 2, 5, 9, 2, 5, 9)],
dtype=[('id', '<i4'), ('a_age', 'i1'), ('a_height', 'i1'), ('a_shoe_size', 'i1'), ('b_age', 'i1'), ('b_height', 'i1'), ('b_shoe_size', 'i1')])
Я не запускал временные тесты, отчасти потому, что не знаю, на что похожи ваши значения x
, y
.
Преобразование структурированного массива с различными числовыми типы данных в обычный массив
или из ответа в https://stackoverflow.com/a/21818731/901925 конструктор np.ndarray
можно использовать для создать новый массив, используя уже существующий буфер данных. Все еще нужно использовать dt1
, все i8
dtype.
np.ndarray((x,), dt1, mat1)
Также ndarray tostructured_array и float to int и многое другое. используя view
v. astype
для этого преобразования.
person
hpaulj
schedule
02.05.2015
pandas
? - person jme   schedule 02.05.2015(x, len(columns))
), и каждый элемент этого массива сам по себе является структурой сlen(columns)
полями. Вы уверены, что это то, что вы имели в виду? (Я предполагаю, что вам действительно нужен одномерный структурированный массив.) - person Warren Weckesser   schedule 02.05.2015x
илиy
, и ваша индексацияmat[:,i+1]
не будет работать со структурированным массивом. - person hpaulj   schedule 03.05.2015