Извлечение словарного элемента из numpy ndarray - PullRequest
0 голосов
/ 07 февраля 2019

Я загружаю файл .npy в Python 3.7.Вывод выглядит так:

>>>import numpy as np
>>>dt = np.load('trajectories.npy')
>>>dt
array({'trajectories': array([[[729.78449821, 391.1702509],
[912.41666667, 315.5       ],
[832.0577381 , 325.83452381]],
...,
[[852.92      , 174.16253968],
[923.36053131, 347.92694497],
[878.89942529, 323.26652299]]]), video_path: 'myPath', frames_per_second: 28}, dtype = object)

Учитывая, что я новичок в numpy ndarrays, объект dt выглядит для меня словарём.Однако, когда я пытаюсь индексировать «траектории», я получаю сообщение об ошибке:

>>>>dt['trajectories']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
>>>>dt.get('trajectories')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'get'

Когда я рассматриваю его как массив:

>>>dt[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array

Когда я пытаюсь преобразовать массив в кортежМне сказали, что массив 0-й.

Что происходит?

1 Ответ

0 голосов
/ 07 февраля 2019

Массив, который вы загрузили, на самом деле является скаляром , что означает, что это объект массива с пустой формой, представляющей значение "не массив".В частности, это скаляр с типом данных object, содержащий Python dict, который в свою очередь содержит числовой массив NumPy под ключом 'trajectories'.

. Во многих случаях скаляры NumPy могут использоваться нечеткоот значения, которое они содержат (например, скалярные числа могут использоваться очень как обычные числа Python).Однако с объектами все сложнее, потому что методы объекта не отображаются через скаляр NumPy.Чтобы «распаковать» скаляр, вы можете использовать метод item, который получит «голое» внутреннее значение.Тогда вы сможете использовать объект как обычно.Например, в вашем случае вы можете просто сделать:

dt.item()['trajectories']

И это даст вам внутренний массив в словаре.

...