Numpy, именованные столбцы

Простой вопрос о numpy:

Я загружаю 100 значений в вектор a. Из этого вектора я хочу создать массив a с двумя столбцами, где один столбец имеет имя "C1", а второй "C2", один имеет тип int32 и другой int64. Пример:

a = range(100)
A = array(a).reshape( len(a)/2, 2)
# A.dtype = ...?

Как определить типы и имена столбцов, когда я создаю массив из a?

Ответ 1

Структурированные массивы NumPy имеют именованные столбцы:

import numpy as np

a=range(100)
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')])
print(A.dtype)
# [('C1', '<i4'), ('C2', '<i8')]

Вы можете получить доступ к столбцам по имени следующим образом:

print(A['C1'])
# [ 0  2  4  6  8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48
#  50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98]

Обратите внимание, что использование np.array с zip заставляет NumPy создать массив из временного списка кортежей. Списки кортежей Python используют намного больше памяти, чем эквивалентные массивы NumPy. Так что если ваш массив очень большой, вы можете не использовать zip.

Вместо этого, используя массив NumPy A, вы можете использовать ravel() чтобы сделать A одномерным массивом, а затем использовать view чтобы превратить его в структурированный массив, а затем использовать astype чтобы преобразовать столбцы в нужный тип:

a = range(100)
A = np.array(a).reshape( len(a)//2, 2)
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),])
print(A[:5])
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#       dtype=[('col1', '<i4'), ('col2', '<i8')])

print(A.dtype)
# dtype([('col1', '<i4'), ('col2', '<i8')])

Ответ 2

Я знаю, что это старый вопрос, но более поздний доступный вариант - попробовать использовать панд. Тип DataFrame предназначен для таких структурированных данных, где столбцы имеют имена и могут быть разных типов.