Структурированный массив numpy в многомерном массиве - PullRequest
0 голосов
/ 08 апреля 2020

Представьте массив numpy размера N x M. В каждой ячейке он содержит структурированный массив с X элементами, каждый из которых содержит x_label.

. Я хотел бы получить доступ к указанному c x_label, поэтому он возвращает только массив N x M содержащий значение метки интереса.

Есть ли способ сделать это без необходимости использовать функцию for l oop (или np.map()) и создавать новый массив?

Пример:

import numpy as np
arr = np.array([[[],[]],
                [[],[]]])

# Each cell contains:
np.array([('par1', 'par2', 'par3')], dtype=[('label_1', 'U10'), ('label_2', 'U10'), ('label3', 'U10')])

Как получить 2x2 np.array, возвращаемое только со значениями par1? Я попытался безуспешно:

arr['label_1']
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Я предполагаю, что ваш внешний массив имеет тип Object dtype, иначе проблем не должно быть:

>>> x = np.array([('par1', 'par2', 'par3')], dtype=[('label_1', 'U10'), ('label_2', 'U10'), ('label3', 'U10')])
>>> Y = np.array(4*[x]+[None])[:-1].reshape(2,2)
>>> Y
array([[array([('par1', 'par2', 'par3')],
      dtype=[('label_1', '<U10'), ('label_2', '<U10'), ('label3', '<U10')]),
        array([('par1', 'par2', 'par3')],
      dtype=[('label_1', '<U10'), ('label_2', '<U10'), ('label3', '<U10')])],
       [array([('par1', 'par2', 'par3')],
      dtype=[('label_1', '<U10'), ('label_2', '<U10'), ('label3', '<U10')]),
        array([('par1', 'par2', 'par3')],
      dtype=[('label_1', '<U10'), ('label_2', '<U10'), ('label3', '<U10')])]],
      dtype=object)

(обратите внимание, как я должен прыгать через обручи, чтобы даже создать такую ​​вещь.)

Упростите свою жизнь, преобразовав в правильный структурированный массив:

>>> Z = np.concatenate(Y.ravel()).reshape(Y.shape)
>>> Z
array([[('par1', 'par2', 'par3'), ('par1', 'par2', 'par3')],
       [('par1', 'par2', 'par3'), ('par1', 'par2', 'par3')]],
      dtype=[('label_1', '<U10'), ('label_2', '<U10'), ('label3', '<U10')])

Теперь вы можете просто индексировать по метке:

>>> Z['label_1']
array([['par1', 'par1'],
       ['par1', 'par1']], dtype='<U10')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...