numpy 中外积的平均值和平均值的外积?
Outer product of average and average of outer product in numpy?
我有两个随时间变化的 3d 列向量 B_mu
和 B_nu
:
import numpy as np
N = 5 # 5 time-steps
B_mu = np.array(
[[5, 5, 8],
[4, 8, 7],
[2, 3, 1],
[5, 7, 8],
[6, 2, 7]]
)
B_nu = np.array(
[[3, 2, 9],
[9, 8, 8],
[4, 9, 9],
[4, 9, 6],
[1, 9, 1]]
)
对于第一个向量中的每个索引 i
和第二个向量中的每个索引 j
,我想计算 time-average 之间的差异< B_mu[i] B_nu[j] >
和 time-average 的 乘积 .
换句话说,我想构造矩阵 M
这样:
M[i,j] = 1/N sum(B_mu[i] * B_nu[j]) - 1/N**2 * sum(B_mu[i]) * sum(B_nu[j])
其中总和取自时间参数。
公式如下:
还有一个明确的扩展版本:
如何在 python 中表达这个等式?
使用模块 numpy 操作矩阵相对容易。我们在这里寻找:
- 对一维(时间)进行平均(或求和);
- 取两个列向量的outer product。
我们将使用:
- method
array.sum
使用可选的 axis
参数对时间维度求和;
- function
outer
.
这两个函数直接结合起来计算平均值的乘积。另一方面,产品的平均值可以直接使用 python 内置 sum
和 map
进行计算;我不知道如何在纯 numpy 中做到这一点。
import numpy as np
def diff_avgprod_prodavg(B_mu, B_nu):
N = B_mu.shape[0]
avg_of_prod = 1/N * sum(map(np.outer, B_mu, B_nu)) # not pure numpy
prod_of_avg = 1/(N*N) * np.outer(B_mu.sum(axis=0), B_nu.sum(axis=0))
return avg_of_prod - prod_of_avg
测试:
B_mu = np.array(
[[5, 5, 8],
[4, 8, 7],
[2, 3, 1],
[5, 7, 8],
[6, 2, 7]]
)
B_nu = np.array(
[[3, 2, 9],
[9, 8, 8],
[4, 9, 9],
[4, 9, 6],
[1, 9, 1]]
)
print( diff_avgprod_prodavg(B_mu, B_nu) )
# [[-1.48 -0.76 -2.84]
# [ 4.8 -0.6 3. ]
# [-0.04 -2.68 -2.52]]
print( diff_avgprod_prodavg(B_mu, B_mu) )
# [[1.84 0. 3.12]
# [0. 5.2 2.8 ]
# [3.12 2.8 6.96]]
print( diff_avgprod_prodavg(B_nu, B_nu) )
# [[ 6.96 0.72 4.28]
# [ 0.72 7.44 -3.64]
# [ 4.28 -3.64 9.04]]
我有两个随时间变化的 3d 列向量 B_mu
和 B_nu
:
import numpy as np
N = 5 # 5 time-steps
B_mu = np.array(
[[5, 5, 8],
[4, 8, 7],
[2, 3, 1],
[5, 7, 8],
[6, 2, 7]]
)
B_nu = np.array(
[[3, 2, 9],
[9, 8, 8],
[4, 9, 9],
[4, 9, 6],
[1, 9, 1]]
)
对于第一个向量中的每个索引 i
和第二个向量中的每个索引 j
,我想计算 time-average 之间的差异< B_mu[i] B_nu[j] >
和 time-average 的 乘积
换句话说,我想构造矩阵 M
这样:
M[i,j] = 1/N sum(B_mu[i] * B_nu[j]) - 1/N**2 * sum(B_mu[i]) * sum(B_nu[j])
其中总和取自时间参数。
公式如下:
还有一个明确的扩展版本:
如何在 python 中表达这个等式?
使用模块 numpy 操作矩阵相对容易。我们在这里寻找:
- 对一维(时间)进行平均(或求和);
- 取两个列向量的outer product。
我们将使用:
- method
array.sum
使用可选的axis
参数对时间维度求和; - function
outer
.
这两个函数直接结合起来计算平均值的乘积。另一方面,产品的平均值可以直接使用 python 内置 sum
和 map
进行计算;我不知道如何在纯 numpy 中做到这一点。
import numpy as np
def diff_avgprod_prodavg(B_mu, B_nu):
N = B_mu.shape[0]
avg_of_prod = 1/N * sum(map(np.outer, B_mu, B_nu)) # not pure numpy
prod_of_avg = 1/(N*N) * np.outer(B_mu.sum(axis=0), B_nu.sum(axis=0))
return avg_of_prod - prod_of_avg
测试:
B_mu = np.array(
[[5, 5, 8],
[4, 8, 7],
[2, 3, 1],
[5, 7, 8],
[6, 2, 7]]
)
B_nu = np.array(
[[3, 2, 9],
[9, 8, 8],
[4, 9, 9],
[4, 9, 6],
[1, 9, 1]]
)
print( diff_avgprod_prodavg(B_mu, B_nu) )
# [[-1.48 -0.76 -2.84]
# [ 4.8 -0.6 3. ]
# [-0.04 -2.68 -2.52]]
print( diff_avgprod_prodavg(B_mu, B_mu) )
# [[1.84 0. 3.12]
# [0. 5.2 2.8 ]
# [3.12 2.8 6.96]]
print( diff_avgprod_prodavg(B_nu, B_nu) )
# [[ 6.96 0.72 4.28]
# [ 0.72 7.44 -3.64]
# [ 4.28 -3.64 9.04]]