Индексные элементы в указанных c размерности numpy - PullRequest
1 голос
/ 14 апреля 2020

Я знаю, что заголовок очень общий, но я не знаю лучшего способа описать мой вопрос.

Я использую scipy's io.loadmat для загрузки файла Matlab Mat. Этот файл mat изначально содержал некоторые структуры, которые, я полагаю, были преобразованы в numpy массивы. Структура файла мата следующая. Есть 500 структур, каждое с 3 полями.

print(data[0].shape)
(500, )

Первое и второе поля имеют элементы формы (300, 300)

print(data[0][0].shape)
(300, 300)
print(data[499][0].shape)
(300, 300)
print(data[0][1].shape)
(300, 300)
print(data[499][1].shape)
(300, 300)

Третье поле - скаляр

print(data[0][2].shape)
(1, 1)
print(data[499][2].shape)
(1, 1)

Я хочу разделить этот файл, чтобы у меня были переменные размера (500, 300, 300), (500, 300, 300) и (500,)

Я пробовал

field1 = data[:][0]

но это дает неправильные элементы. field1[0] = data[0][0], field1[1] = data[0][1], field1[2] = data[0][2] и field1[3] дают недопустимую ошибку индекса. Я хочу field1[0] = data[0][0] ... field1[499] = data[499][0]

Как индексировать по размеру 500?

Я знаю, что могу сделать

field1 = np.array([data[i][0] for i in range(500)])

, но я мне интересно, есть ли что-то попроще

1 Ответ

0 голосов
/ 14 апреля 2020

Похоже, у вас есть структурированный массив с 3 полями. Что-то в этой строке:

два поля:

In [38]: dt = np.dtype([('f0',int,(2,2)),('f1','U3',(1,1))])                                           

для записей / элементов:

In [39]: data = np.zeros((4,), dtype=dt)                                                               
In [40]: data                                                                                          
Out[40]: 
array([([[0, 0], [0, 0]], [['']]), ([[0, 0], [0, 0]], [['']]),
       ([[0, 0], [0, 0]], [['']]), ([[0, 0], [0, 0]], [['']])],
      dtype=[('f0', '<i8', (2, 2)), ('f1', '<U3', (1, 1))])
In [41]: data.shape                                                                                    
Out[41]: (4,)

одна запись:

In [42]: data[0]                                                                                       
Out[42]: ([[0, 0], [0, 0]], [['']])

поле может быть выбрано по номеру - потому что это кортеж (или подобный кортежу):

In [43]: data[0][0]                                                                                    
Out[43]: 
array([[0, 0],
       [0, 0]])

, но для выбора по полю для всех записей используйте имя:

In [45]: data['f0']                                                                                    
Out[45]: 
array([[[0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0]],

       [[0, 0],
        [0, 0]]])
In [46]: data['f0'].shape                                                                              
Out[46]: (4, 2, 2)
...