英文:
Fast implementations in Python to compute the mean of products
问题
我有一个浮点数元素列表 x=[0.1, 2, 0.5, ...]
,长度为 l=len(x)
。我正在寻找快速/矢量化的实现来计算 x
中所有两对元素的乘积的平均值:
S=0.0
for x1 in x:
for x2 in x:
S+=x1*x2/(l*l)
这本质上是 x
的样本协方差。我查看了 numpy
的 cov()
函数,但该函数计算协方差矩阵,或者在列表的情况下只是样本方差。而 correlate()
函数使用滑动窗口的样本,而非列表中所有元素对的组合。
编辑: 尽管原始问题中没有说明,但不涉及 l^2 内存的方法将受到极大赞赏。以下提出的 np.outer
和 numpy 广播都需要 l^2 内存,这使它们对于大型 l 不可行。
英文:
I have a list of float elements x=[0.1, 2, 0.5, ...]
with length l=len(x)
. I am looking for fast/vectorized implementations to compute mean of the products between all two pairs from x
:
S=0.0
for x1 in x:
for x2 in x:
S+=x1*x2/(l*l)
This would essentially be the sample covariance of x
. I looked into numpy
's cov()
function, however, that computes a covariance matrix, or, in the case of a list, simply the sample variance. Also, the correlate()
function uses samples from a sliding window, not the combination of all element pairs from the list.
Edit: Although not stated in the original question, methods not involving l^2 memory would be greatly appreciated. np.outer
and numpy broadcasting proposed below both have l^2 memory requirements which make them unfeasible for large l.
答案1
得分: 4
你可以使用简单的numpy广播操作来执行你所询问的计算:
import numpy as np
x = np.asarray([0.1, 2, 0.5])
l = len(x)
S = np.sum(x[:, None] * x[None, :]) / l**2
英文:
You can do the calculation you're asking about with simple numpy broadcasting operations:
import numpy as np
x = np.asarray([0.1, 2, 0.5])
l = len(x)
S = np.sum(x[:, None] * x[None, :]) / l**2
答案2
得分: 2
表达式 np.multiply.outer(x, x).mean()
就可以做到。
举个例子,这是你的计算:
In [17]: x = [0.1, 2, 0.5, 3, 0.25, 1]
In [18]: l = len(x)
In [19]: S=0.0
...: for x1 in x:
...: for x2 in x:
...: S+=x1*x2/(l*l)
...:
In [20]: S
Out[20]: 1.3034027777777775
这是 np.multiply.outer(x, x).mean()
:
In [21]: np.multiply.outer(x, x).mean()
Out[21]: 1.3034027777777777
@Blckknght的答案也同样有效。
英文:
The expression np.multiply.outer(x, x).mean()
will do it.
For example, here's your calculation:
In [17]: x = [0.1, 2, 0.5, 3, 0.25, 1]
In [18]: l = len(x)
In [19]: S=0.0
...: for x1 in x:
...: for x2 in x:
...: S+=x1*x2/(l*l)
...:
In [20]: S
Out[20]: 1.3034027777777775
And here's np.multiply.outer(x, x).mean()
:
In [21]: np.multiply.outer(x, x).mean()
Out[21]: 1.3034027777777777
@Blckknght's answer also works just as well.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论