我有两个Numpy数组,xy,其中x是n维的,n>=1但在"编译时"是未知的,而y是一维的.第一个维度x保证与第一个(也是唯一的)维度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.这可能会抛出错误,或者更糟糕的是,可能会碰巧产生意外的结果.

我找到了两个相对不错的One衬垫,

s1 = (x.T + y).T
s2 = x + y[(slice(0, y.shape[0]),) + (np.newaxis,)*(x.ndim-1)]

还不错.第一个是利用这一事实,即它确实是x中的first维与y中唯一的维相匹配.否则,它是行不通的.第二个比较笼统,但很冗长.

由于我还在学习Python和Numpy,我想知道是否有其他(理想情况下更好,但我也对一般情况感兴趣)可以做我想做的事情.从本质上说,我可能在寻找一种超越广播惯例的方法……

推荐答案

你不能改变广播规则.因此,无论如何,您必须将拖尾维度添加到y.

您已经使用了newaxis,产生:

In [9]: y[:,None,None].shape
Out[9]: (5, 1, 1)

构造一个类似的reshape元组可能会更简单一些:

In [10]: y.reshape((-1,1,1)).shape
Out[10]: (5, 1, 1)

expand_dims是指定reshape的另一种方式:

In [11]: np.expand_dims(y,(1,2)).shape
Out[11]: (5, 1, 1)

所有这些代码在计算上都不是很昂贵,即使代码最后有点冗长.

有几个atleast个函数,但它没有帮助:

In [19]: np.atleast_3d(y).shape
Out[19]: (1, 5, 1)

尽管如此,看看expand_dims或这atleast的代码可能会让你想到如何添加维度.他们以某种方式使用newaxisreshape.

您也可以使用np.array指定尺寸,但这会添加前导尺寸:

In [22]: np.array(y, ndmin=3, copy=False).shape
Out[22]: (1, 1, 5)

编辑

使用x.ndim:

In [30]: dim=[1]*x.ndim; dim[0]=-1;y.reshape(dim).shape
Out[30]: (5, 1, 1)
In [44]: y.reshape((-1,)+(1,)*(x.ndim-1)).shape
Out[44]: (5, 1, 1)

In [33]: np.expand_dims(y,tuple(np.arange(1,x.ndim))).shape
Out[33]: (5, 1, 1)
In [36]: np.expand_dims(y,list(range(1,x.ndim))).shape
Out[36]: (5, 1, 1)

您的版本,略有简化:

In [45]: y[((slice(None),)+(None,)*(x.ndim-1))].shape
Out[45]: (5, 1, 1)

在时间上,这是最快的.

Python相关问答推荐

根据不同列的值在收件箱中移动数据

ModuleNotFound错误:没有名为flags.State的模块; flags不是包

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

使用groupby Pandas的一些操作

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

如何在Python数据框架中加速序列的符号化

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

使用Python查找、替换和调整PDF中的图像'

未调用自定义JSON编码器

替换现有列名中的字符,而不创建新列

Gunicorn无法启动Flask应用,因为无法将应用解析为属性名或函数调用.'"'' "

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

来自Airflow Connection的额外参数

根据过滤后的牛郎星图表中的数据计算新系列

使用xlsxWriter在EXCEL中为数据帧的各行上色

将索引表转换为Numy数组

将鼠标悬停在海运`pairplot`的批注/高亮显示上

如何有效地计算所有输出相对于参数的梯度?