Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.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/3/arrays/12.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/1/visual-studio-2012/2.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 矢量化numpy赋值_Python_Arrays_Numpy - Fatal编程技术网

Python 矢量化numpy赋值

Python 矢量化numpy赋值,python,arrays,numpy,Python,Arrays,Numpy,我通过在其他numpy数组中查找值来为numpy数组赋值。这些数组具有潜在的不同索引。以下是一个例子: import numpy as np A=1; B=2; C=3; D=4; E=5 X = np.random.normal(0,1,(A,B,C,E)) Y = np.random.normal(0,1,(A,B,D)) Z = np.random.normal(0,1,(A,C)) Result = np.zeros((A,B,C,D,E)) for a in range(A):

我通过在其他numpy数组中查找值来为numpy数组赋值。这些数组具有潜在的不同索引。以下是一个例子:

import numpy as np
A=1; B=2; C=3; D=4; E=5
X = np.random.normal(0,1,(A,B,C,E))
Y = np.random.normal(0,1,(A,B,D))
Z = np.random.normal(0,1,(A,C))
Result = np.zeros((A,B,C,D,E))
for a in range(A):
    for b in range(B):
        for c in range(C):
            for d in range(D):
                for e in range(E):
                    Result[a,b,c,d,e] = Z[a,c] + Y[a,b,d] + X[a,b,c,e]
优化此代码的最佳方法是什么?我可以使用结果[a,b,c,d:]=Z[a,c]+Y[a,b,d]+X[a,b,c,:]删除E for循环。那么,如何删除其余的循环呢?我还认为我可以在赋值之前操纵X,Y,Z,这样它就可以很容易地与结果的维度合并。一定有更优雅的方式。谢谢你的提示。

这里有一种方法:

Result = Z[:,None,:,None,None] + Y[:,:,None,:,None] + X[:,:,:,None,:]
为了生成这个矢量化版本,我所做的只是将各种索引替换为
X
Y
Z
,使用完整的
a、b、c、d、e
样式索引,在发现缺少索引的地方插入
None
。例如,
Y[a,b,d]
变为
Y[a,b,None,d,None]
,这将矢量化为
Y[,:,None,:,None]


在numpy中,通过
None
索引告诉数组假装它有一个附加轴。这不会改变数组的大小,但会改变操作的广播方式,这正是我们需要的。查看以了解更多信息。

这更多是一个codereview.stackexchange.com问题。你应该把它移植到那里,看看人们会想出什么样的优化技巧。虽然从技术上讲这是一个代码优化问题,但像这样的问题(如何在
numpy
?)在SO中经常被问到。这真是一个“如何”的问题。回答得很好。如果您还可以添加一个指向一些文档的链接,这些文档描述了这将对广播带来的更改,那将是一件好事。使用我提供的参数,速度将提高75倍。。。谢谢