我有两个Numpy数组x
和y
,其中x
是n维的,n〉=1,但在“编译时”未知,而y
是一维的。y
的(也是唯一的)维度。我想得到他们的“总和”,称之为s
,与x
的维度相同,如下所示:
import numpy as np
x = np.random.randn(5,100,10)
y = np.random.randn(5)
s = np.empty_like(x)
for i in range(x.shape[0]):
s[i] = x[i] + y[i]
但我希望避免for循环,这既是出于可读性考虑,更重要的是出于速度考虑。
很明显,由于Numpy中的广播约定是如何工作的,我不能做x+y
。这要么会抛出错误,要么更糟的是,会碰巧工作,给出意想不到的结果。
我找到了两个不错的俏皮话,
s1 = (x.T + y).T
s2 = x + y[(slice(0, y.shape[0]),) + (np.newaxis,)*(x.ndim-1)]
第一个是利用了x
中的第一个维度与y
中的唯一维度匹配的事实,否则就不起作用了,第二个更一般,但是非常冗长。
由于我还在学习Python和Numpy,我想知道是否有其他(理想情况下更好,但我也对一般情况感兴趣)替代方法来做我想做的事情。本质上,我可能正在寻找的是一种覆盖广播约定的方法...
1条答案
按热度按时间6g8kf2rb1#
你不能改变广播规则,所以无论如何你必须给
y
添加尾部维度。您已经使用了
newaxis
,生成了:为
reshape
构造一个类似的元组可能要简单一些:expand_dims
是指定reshape
的另一种方式:型
这些都不是计算上昂贵的,即使代码最终有点冗长。
有几个
atleast
函数,但没有帮助:尽管如此,看看
expand_dims
或atleast
的代码可能会给予你一些如何添加维度的想法,不管怎样,他们使用newaxis
或reshape
。也可以使用
np.array
指定尺寸,但这会添加前导尺寸:编辑
使用
x.ndim
:你的版本,稍微简化一下:
在时间上,这是最快的。