Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多维数组中的多元素索引_Python_Numpy - Fatal编程技术网

Python 多维数组中的多元素索引

Python 多维数组中的多元素索引,python,numpy,Python,Numpy,我有一个3d Numpy数组,我想取一个轴上的平均值,考虑其他二维的某些元素 这是一个描述我的问题的示例代码: 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) ] 然而,这导致: ValueError: sha

我有一个3d Numpy数组,我想取一个轴上的平均值,考虑其他二维的某些元素

这是一个描述我的问题的示例代码:

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) ]
然而,这导致:

ValueError: shape mismatch: objects cannot be broadcast to a single shape

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

既然使用连续元素,就可以使用切片:

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)]

这就是您在多个维度上创建索引的方式:

>>> 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的额外维度,以便广播正常工作

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


如果要对非连续元素执行此操作,必须探索复杂的索引机制。

这就是解决问题的方法,但为什么示例不起作用?谢谢!如果没有连续元素,解决方案是什么?问题是在整数数组子索引的情况下必须遵循广播规则。如果要非连续,请使用布尔索引。如果索引数组不具有相同的形状,则会尝试将它们广播到相同的形状。如果它们不能以相同的形状播放,就会出现一个例外:即使是第二眼,这也让我感到困惑。不管怎样,它是有效的,我非常感谢你的解释!这是令人困惑的,但是如果你想得够久,你最终会发现语法更有意义,并且提供了更一致的行为,特别是在考虑多维索引数组时。当所有索引数组都是1D时,它们本可以实现一种特殊情况,但正如Python的Zen在myarray是掩码数组的情况下所述,我得到:TypeError:元组索引必须是整数,而不是元组。所以屏蔽数组的行为不同?