Python np.ufunc.at和np.ix的Numpy多维索引_
我想知道如何从一个数组中获取索引并与另一个数组相乘。我有两个4d数组和一个2d索引数组:Python np.ufunc.at和np.ix的Numpy多维索引_,python,numpy,numpy-ndarray,numpy-slicing,numpy-ufunc,Python,Numpy,Numpy Ndarray,Numpy Slicing,Numpy Ufunc,我想知道如何从一个数组中获取索引并与另一个数组相乘。我有两个4d数组和一个2d索引数组: base = np.ones((2, 3, 5, 5)) to_multiply = np.arange(120).reshape(2, 3, 4, 5) index = np.array([[0, 2, 4, 2], [0, 3, 3, 2]]) 索引数组的行索引对应于base的第一维和_乘法,索引数组的值对应于base的第三维。我想根据索引从基片上取一个切片,然后与to_相乘 使用for loops和
base = np.ones((2, 3, 5, 5))
to_multiply = np.arange(120).reshape(2, 3, 4, 5)
index = np.array([[0, 2, 4, 2], [0, 3, 3, 2]])
索引数组的行索引对应于base的第一维和_乘法,索引数组的值对应于base的第三维。我想根据索引从基片上取一个切片,然后与to_相乘
使用for loops和np.multiply.at(因为我可能有相同的索引),我可以通过以下方式实现:
for i, x in enumerate(index):
np.multiply.at(base[i, :, :, :], np.s_[:, x, :], to_multiply[i, :, :, :])
可通过以下方式验证上述内容的正确性:
to_multiply[0, 0, :, 0]
array([ 0, 5, 10, 15])
base[0, 0, :, 0]
array([ 0., 1., 75., 1., 10.])
但是,我想知道是否有使用np.multiply.at和np.ix_389;的单行解决方案
我试着使用np.ix,但我对此感到非常困惑,因为在这种情况下,它是多维的。无法使用
ix
。从其文档中:
此函数获取N个1-D序列并返回N个带N的输出
每个尺寸
您的索引是2d
但是,我们可以“用手”做同样的事情:
In [196]: np.multiply.at(base1, (np.arange(2)[:,None,None],np.arange(3)[:,None],index[:,None,:]), to_
...: multiply)
In [197]: np.allclose(base,base1)
Out[197]: True
我们的目标是制作3个阵列,它们一起广播,以匹配到_multiply
(最后一个尺寸为5的维度除外)
即a(2,1,1)、(1,3,1)和(2,1,4)=>(2,3,4)
虽然我对我想去的地方有一个大致的想法,但我必须先尝试很多想法。用ix\uuu
是做不到的。从其文档中:
此函数获取N个1-D序列并返回N个带N的输出
每个尺寸
您的索引是2d
但是,我们可以“用手”做同样的事情:
In [196]: np.multiply.at(base1, (np.arange(2)[:,None,None],np.arange(3)[:,None],index[:,None,:]), to_
...: multiply)
In [197]: np.allclose(base,base1)
Out[197]: True
我们的目标是制作3个阵列,它们一起广播,以匹配到_multiply
(最后一个尺寸为5的维度除外)
即a(2,1,1)、(1,3,1)和(2,1,4)=>(2,3,4)
虽然我对我想去的地方有一个大致的想法,但我必须先尝试很多想法