Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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 np.ufunc.at和np.ix的Numpy多维索引__Python_Numpy_Numpy Ndarray_Numpy Slicing_Numpy Ufunc - Fatal编程技术网

Python np.ufunc.at和np.ix的Numpy多维索引_

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和

我想知道如何从一个数组中获取索引并与另一个数组相乘。我有两个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和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)

虽然我对我想去的地方有一个大致的想法,但我必须先尝试很多想法