想象一下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
谢谢!
我假设您的外部数组是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')