多维数组中的结构化numpy数组

问题描述 投票:0回答:1

想象一下numpy维的N x M数组。在每个单元格中,它包含一个具有X个元素的结构化数组,每个元素都包含一个x_label

我想访问特定的x_label,因此它返回仅包含所关注标签值的N x M数组。

是否有一种不必使用for循环(或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')])

如何获得仅返回np.array值的2x2 par1?我尝试失败:

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

谢谢!

python arrays numpy multidimensional-array structured-array
1个回答
1
投票

我假设您的外部数组是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')
© www.soinside.com 2019 - 2024. All rights reserved.