gpt4 book ai didi

python - Numpy 矩阵运算

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:31 24 4
gpt4 key购买 nike

我想为所有 ij 计算以下值:

M_ki = Sum[A_ij - A_ik - A_kj + A_kk, 1 <= j <= n]

如何在没有显式循环的情况下使用 Numpy (Python) 来实现?

谢谢!

最佳答案

这是解决此类问题的一般策略。

首先,编写一个小脚本,在两个不同的函数中显式编写循环,最后进行测试以确保这两个函数完全相同:

import numpy as np
from numpy import newaxis

def explicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
for j in range(n):
m[k,i] += a[i,j] - a[i,k] - a[k,j] + a[k,k]
return m

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
for j in range(n):
m[k,i] += a[i,j] - a[i,k] - a[k,j] + a[k,k]
return m

a = np.random.randn(10,10)
assert np.allclose(explicit(a), implicit(a), atol=1e-10, rtol=0.)

然后,通过编辑 implicit 逐步矢量化函数,在每一步运行脚本以确保它们继续保持不变:

第一步

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
for k in range(n):
for i in range(n):
m[k,i] = (a[i,:] - a[k,:]).sum() - n*a[i,k] + n*a[k,k]
return m

第 2 步

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
m = - n*a.T + n*np.diag(a)[:,newaxis]
for k in range(n):
for i in range(n):
m[k,i] += (a[i,:] - a[k,:]).sum()
return m

步骤 3

def implicit(a):
n = a.shape[0]
m = np.zeros_like(a)
m = - n*a.T + n*np.diag(a)[:,newaxis]
m += (a.T[newaxis,...] - a[...,newaxis]).sum(1)
return m

瞧瞧!最后一个没有循环。向量化那种方程式,broadcasting是要走的路!

警告:确保 explicit 是您想要向量化的方程。我不确定不依赖于 j 的项是否也应该求和。

关于python - Numpy 矩阵运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3657884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com