And*_*ler 5 python arrays indexing numpy
假设我有一个大小为nxmxk的numpy数组A和另一个大小为nxm且索引从1到k的数组B. 我想使用B中这个地方给出的索引访问A的每个nxm切片,给我一个大小为nx m的数组.
编辑:这显然不是我想要的![[我可以这样使用take:
A.take(B)
]]结束编辑
这可以通过花式索引来实现吗?我原以为A[B]会给出相同的结果,但是会产生一个大小为nxmxmxk的数组(我真的不明白).
我不想使用的原因take是我希望能够分配这个部分,比如
A[B] = 1
到目前为止,唯一可行的解决方案是
A.reshape(-1, k)[np.arange(n * m), B.ravel()].reshape(n, m)
但肯定有一个更简单的方法吗?
认为
import numpy as np
np.random.seed(0)
n,m,k = 2,3,5
A = np.arange(n*m*k,0,-1).reshape((n,m,k))
print(A)
# [[[30 29 28 27 26]
# [25 24 23 22 21]
# [20 19 18 17 16]]
# [[15 14 13 12 11]
# [10 9 8 7 6]
# [ 5 4 3 2 1]]]
B = np.random.randint(k, size=(n,m))
print(B)
# [[4 0 3]
# [3 3 1]]
Run Code Online (Sandbox Code Playgroud)
要创建这个数组,
print(A.reshape(-1, k)[np.arange(n * m), B.ravel()])
# [26 25 17 12 7 4]
Run Code Online (Sandbox Code Playgroud)
作为nxm使用奇特索引的数组:
i,j = np.ogrid[0:n, 0:m]
print(A[i, j, B])
# [[26 25 17]
# [12 7 4]]
Run Code Online (Sandbox Code Playgroud)