我想计算数量测量C的协方差,其中每个单独的数量测量都有自己的权重。也就是说,我的权重数组与我的数量数组具有相同的形状(by )。当地人npWQnpnp.cov()函数仅支持赋予各个测量值的权重(即长度为 的向量n)。
我可以初始化p一个p并迭代,但如果p很大,那么这是一个非常慢的过程。
由于Q已知每个量( 的列Q)的均值为零,因此 的每个元素的显式公式C为
C[i,j] = np.sum(
Q[:, i] * Q[:, j] * W[:, i] * W[:, j]) / np.sum(W[:, i] * W[:, j])
Run Code Online (Sandbox Code Playgroud)
如果我将分子重新排列为Q[:, i] * W[:, i] * Q[:, j] * W[:, j],似乎我应该能够对 的列进行乘法和求和Q * W,然后以类似的方式计算分母(除了使用W * W)。
有没有办法做到这一点np.einsum()?
为了进行测试,我们定义以下内容:
C = array([[ …Run Code Online (Sandbox Code Playgroud) 我正在尝试执行大型线性代数计算,以将通用协方差矩阵KK_l_obs(形状(NL, NL))转换为缩小空间Kmap_PC(形状(q, q, X, Y))中的协方差矩阵的映射.
有关如何Kmap_PC为每个空间位置构造的信息保存在其他数组a中I0,和k_l_th.前两个有形状(X, Y),第三个有形状(nl, nl).观察到的和缩小的空间之间的转换由eingenvectors E(形状(q, nl))传递.请注意NL> nl.
空间元素Kmap_PC计算如下:
Kmap_PC[..., X, Y] = E.dot(
KK_l_obs[I0[X, Y]: I0[X, Y] + nl,
I0[X, Y]: I0[X, Y] + nl] / a_map[X, Y] + \
k_l_th).dot(E.T)
Run Code Online (Sandbox Code Playgroud)
理论上,第一个点积内的位可以直接使用np.einsum,但会占用数百GB的内存.我现在正在做的是循环空间索引Kmap_PC,这很慢.我也可以使用MPI分配计算(这可能会提供3-4倍的加速,因为我有16个核心可用).
我在想:
(a)如果我能更有效地进行计算 - 或许明确地将其分解为空间元素组; 和
(b)如果我可以改善那些计算的内存开销.
代码段
import numpy …Run Code Online (Sandbox Code Playgroud) 我正在研究在scipy中拟合3d分布函数.我有一个numpy数组,其中有x和y-bin的计数,我试图将其与一个相当复杂的三维分布函数相匹配.数据适合26(!)参数,这些参数描述了其两个成分群体的形状.
我在这里学到了当我调用leastsq时,我必须将我的x和y坐标作为'args'传递.unutbu提供的代码是为我编写的,但当我尝试将其应用于我的特定情况时,我收到错误"TypeError:leastsq()得到关键字参数'args'的多个值"
这是我的代码(抱歉长度):
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as spopt
from textwrap import wrap
import collections
cl = 0.5
ch = 3.5
rl = -23.5
rh = -18.5
mbins = 10
cbins = 10
def hist_data(mixed_data, mbins, cbins):
import numpy as np
H, xedges, yedges = np.histogram2d(mixed_data[:,1], mixed_data[:,2], bins = (mbins, cbins), weights = mixed_data[:,3])
x, y = 0.5 * (xedges[:-1] + xedges[1:]), 0.5 * (yedges[:-1] + yedges[1:])
return H.T, x, y
def gauss(x, s, …Run Code Online (Sandbox Code Playgroud)