хранение массивов записей в массивах объектов - PullRequest
0 голосов
/ 15 апреля 2010

Я хотел бы преобразовать список массивов записей - dtype is (uint32, float32) - в массив ntype с кодом dtype np.object:

X = np.array(instances, dtype = np.object)

где instances - список массивов с типом данных np.dtype([('f0', '<u4'), ('f1', '<f4')]). Однако приведенный выше оператор приводит к массиву, элементы которого также имеют тип np.object:

X[0]
array([(67111L, 1.0), (104242L, 1.0)], dtype=object)

Кто-нибудь знает почему?

Следующее утверждение должно быть эквивалентно приведенному выше, но дает желаемый результат:

X = np.empty((len(instances),), dtype = np.object)
X[:] = instances
X[0]
array([(67111L, 1.0), (104242L, 1.0), dtype=[('f0', '<u4'), ('f1', '<f4')])

спасибо и наилучшими пожеланиями, питер

1 Ответ

1 голос
/ 15 апреля 2010

Стефан ван дер Вальт (разработчик): объясняет :

Конструктор ndarray делает все возможное угадать, какие вы данные кормить его, но иногда это нужно немного помощи ....

Я предпочитаю строить массивы явно, так что нет сомнений, что происходит под капотом:

Когда вы говорите что-то вроде

instance1=np.array([(67111L,1.0),(104242L,1.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')]))
instance2=np.array([(67112L,2.0),(104243L,2.0)],dtype=np.dtype([('f0', '<u4'), ('f1', '<f4')]))
instances=[instance1,instance2]
Y=np.array(instances, dtype = np.object)

np.array вынужден угадать, какой размер массива вы хотите. instances - это список из двух объектов, каждый из которых имеет длину 2. Поэтому, вполне разумно, np.array предполагает, что Y должен иметь форму (2,2):

print(Y.shape)
# (2, 2)

В большинстве случаев я думаю, что это то, что было бы желательно. Тем не мение, в вашем случае, поскольку это не то, что вам нужно, вы должны явно создать массив:

X=np.empty((len(instances),), dtype = np.object)
print(X.shape)
# (2,)

Теперь нет вопроса о форме X: (2, ) и так, когда вы вводите данные

X[:] = instances

numpy достаточно умен, чтобы рассматривать instances как последовательность двух объектов.

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