Как создать массив массивов записей? - PullRequest
8 голосов
/ 12 октября 2011

Это дает мне ошибку:

import numpy as np
x = np.array([[1, 'O', 1]],
             dtype=np.dtype([('step', 'int32'),
                             ('symbol', '|S1'),
                             ('index', 'int32')]))

TypeError: expected a readable buffer object

Я не знаю, почему это должно не получиться?

Альтернативно, как я могу заставить что-то подобное этому выражению работать?

x = np.array([[1, 'O', 1]])

затем

x.dtype = np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')])

или

x.view(dtype=np.dtype([('step', 'int32'),('symbol', '|S1'),('index', 'int32')]))

оба дают мне

ValueError: new type not compatible with array.

Редактировать

Если я попытаюсь ввести каждую запись в виде кортежа, он подумает, что тройка - это одно значение, а не три отдельных поля?Например:

import numpy as np
x = np.array([(1, 'O', 1)],
             dtype=np.dtype([('step', 'int32'),
                             ('symbol', '|S1'),
                             ('index', 'int32')]))

кажется нормальным, пока я не сделаю это:

import numpy.lib.recfunctions as rec
rec.append_fields(x,'x',x['index']+1)

дает мне

TypeError: object of type 'numpy.int32' has no len()

предположительно, потому что x.shape - это (1,)чем (1,3).

Ответы [ 2 ]

7 голосов
/ 12 октября 2011

Сделать каждую строку кортежем, а не списком:

import numpy as np
x = np.array([(1, 'O', 1)],
             dtype=np.dtype([('step', 'int32'),
                             ('symbol', '|S1'),
                             ('index', 'int32')]))

Разработчик Numpy Роберт Керн объясняет :

Как правило, кортежи считаются"скалярные" записи и списки возвращаются.Это правило помогает numpy.array () выяснить, какие последовательности являются записями, а какие - другими последовательностями, для которых необходимо выполнить рекурсию;т.е. какие последовательности создают другое измерение, а какие являются атомными элементами.

1 голос
/ 16 ноября 2014

Я покажу более общий способ создания массива записей:

# prepare the array with different types
recarr = np.zeros((4,), dtype=('i4,f4,a10'))

# creating the columns
col1 = [1, 7, 2, 3]
col2 = [1.1, 0.5, 2, 7.45]
col3 = ['This', 'is', 'text', '!!!']

# create a list of tuples from columns
prepare = zip(col1, col2, col3)

# assigning value so recarr
recarr[:] = prepare

Теперь вы можете назначить имена для каждого из столбцов:

recarr.dtype.names = ('ID' , 'price', 'text')

и позже получить значения дляэтот столбец:

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