我想根据某些维度的索引位置数组提取 numpy ndarray 的一部分。让我用一个例子来说明这一点
示例数据
dummy = np.random.rand(5,2,100)
X = np.array([[0,1],[4,1],[2,0]])
dummy
是维度为 5x2x100 的原始 ndarray。这个维度是任意的,也可以是 5x2x4x100。
X
是索引值矩阵,这里X[:,0]
是dummy
第一维的索引,X [:,1]
那些二维的。 X 中的列数始终是 dummy
中的维数减 1。
示例输出
我想为此示例提取以下形式的 ndarray
[
dummy[0,1,:],
dummy[4,1,:],
dummy[2,0,:]
]
并发症
如果 dummy
中的维数是固定的,这可以通过 dummy[X[:,0],X[:,1],:]
。遗憾的是维度可能不同,例如dummy
可以是 5x2x4x6x100 ndarray 并且 X
相应地是 3x4 。我尝试处理它并没有产生预期的结果。
dummy[X,:]
在此示例中生成一个 3x2x2x100 ndarray,与dummy[X]
相同
- 迭代地减少
dummy
通过做类似dummy = dummy[X[:,i],:]
和i
的迭代器X
的列数也不会减少示例中的 ndarray 过去 3x2x100
我觉得使用 numpy 索引应该很简单,但我想我对解决方案的搜索缺少正确的术语。
有人对此有解决方案吗?
最佳答案
我将尝试为@Michael Szczesny 的回答提供一些可解释性。
首先,请注意,如果您有一个 np.array
尺寸 n
并通过 m
索引 m<n
, 那么它将与使用相同 :
在维度 >=m
.例如,在您的情况下:
dummy[(0, 0)] == dummy[0, 0, :]
鉴于此,请注意您还可以将数组作为索引传递。因此:
dummy[([0, 1], [0, 0])]
这将是一样的:
np.array([dummy[(0,0)], dummy[(1,0)]])
您可以使用以下方式验证:
dummy[([0, 1], [0, 0])] == np.array([dummy[(0,0)], dummy[(1,0)]])
最后,请注意:
(*X.T,)
# (array([0, 4, 2]), array([1, 1, 0]))
你在这里获取每个维度作为一个数组,然后你将得到:
[
dummy[0,1],
dummy[4,1],
dummy[2,0]
]
这与:
[
dummy[0,1,:],
dummy[4,1,:],
dummy[2,0,:]
]
编辑:您可以使用 tuple(X.T) 而不是使用 (*X.T,),这对我来说更有意义
关于python - 使用索引数组从任意维的 ndarray 中提取 2d ndarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73771467/