NumPy, именованные столбцы - PullRequest
       3

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

15 голосов
/ 12 августа 2011

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 12 августа 2011

Структурированные массивы 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 массивом 1D, а затемиспользуйте 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')])
9 голосов
/ 26 декабря 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...