多维数组中的多元素索引

2024-06-26 14:08:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个三维纽比阵列,并想采取平均超过一个轴考虑某些元素从其他两个维度。在

以下是描述我的问题的示例代码:

import numpy as np
myarray = np.random.random((5,10,30))
yy = [1,2,3,4]
xx = [20,21,22,23,24,25,26,27,28,29]
mymean = [ np.mean(myarray[t,yy,xx]) for t in np.arange(5) ]

但是,这会导致:

^{pr2}$

为什么像myarray[:,[1,2,3,4],[1,2,3,4],[1,2,3,4]]这样的索引可以工作,但上面的代码不行?在


Tags: 代码inimportnumpy元素示例foras
3条回答

这就是您对索引在多个维度上的喜好:

>>> np.mean(myarray[np.arange(5)[:, None, None], np.array(yy)[:, None], xx],
            axis=(-1, -2))
array([ 0.49482768,  0.53013301,  0.4485054 ,  0.49516017,  0.47034123])

当您使用花哨的索引(即列表或数组作为索引)时,numpy将这些数组广播到一个公共形状,并使用它们来索引数组。您需要在第一个索引数组的末尾添加长度为1的额外维度,以便广播正常工作。Here are the rules of the game。在

为了回答您关于它为什么不起作用的问题:当您使用列表/数组作为索引时,Numpy使用的索引语义与使用切片时不同。您可以在the documentation中看到完整的故事,正如该页所说,它“可能有点令人难以置信”。在

如果您想对不连续的元素执行此操作,则必须探索复杂的索引机制。在

由于使用连续元素,因此可以使用切片:

import numpy as np
myarray = np.random.random((5,10,30))
yy = slice(1,5)
xx = slice(20, 30)
mymean = [np.mean(myarray[t, yy, xx]) for t in np.arange(5)]

相关问题 更多 >