【问题标题】:How to calculate the multidimensional array with broadcasting?如何用广播计算多维数组?
【发布时间】:2019-07-19 11:11:56
【问题描述】:

我通过 double for 循环计算元素如下。

N,l=20,10
a=np.random.rand(N,l)
b=np.random.rand(N,l)
r=np.zeros((N,N,l))

for i in range(N):
    for j in range(N):
        r[i,j]=a[i]*a[j]*(b[i]-b[j])-a[i]/a[j]

问题:

  1. 如何向量化数组并用广播计算?

  2. 我还想设置索引i不等于j,这意味着保持对角元素为零。我也可以通过矢量化来做到这一点吗?

【问题讨论】:

    标签: python arrays numpy vectorization broadcast


    【解决方案1】:

    您可以广播所有算术并删除循环。s

    r2 = (a[:,None]*a) * (b[:,None]-b) - (a[:,None]/a)
    
    # Verify the correctness
    np.array_equal(r, r2)
    # True
    

    最后,要将对角线设置为零,请使用就地赋值

    r2[(np.arange(N),)*2] = 0
    

    或者,numpy.fill_diagonal,也可以就地填充。

    np.fill_diagonal(r2, 0)
    

    【讨论】:

    • Thx,有没有办法让对角线元素的原始值保持为 0?
    • @kinderchen 不确定您的意思?这似乎产生与您当前代码相同的输出。
    • 是的,我只是想知道它是否也可以将对角线元素保持为零。
    • @kinderchen 使用np.fill_diagonal(r2, 0)
    • @coldspeed 你能帮忙解决以下问题吗stackoverflow.com/questions/54865312/…
    猜你喜欢
    • 2012-06-26
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多