Python 使用Numpy代替循环
我有以下虚拟数据:Python 使用Numpy代替循环,python,numpy,vectorization,Python,Numpy,Vectorization,我有以下虚拟数据: import numpy as numpy x = np.linspace(1, 10, 10) y = np.linspace(1, 10, 10) x[::-1].sort() y[::-1].sort() tot_value = np.sum(y) n_values = np.array([1, 2, 3]) final = np.sum((x[:, np.newaxis]**(1/n_values))*(y[:, np.newaxis]/tot_value))
import numpy as numpy
x = np.linspace(1, 10, 10)
y = np.linspace(1, 10, 10)
x[::-1].sort()
y[::-1].sort()
tot_value = np.sum(y)
n_values = np.array([1, 2, 3])
final = np.sum((x[:, np.newaxis]**(1/n_values))*(y[:, np.newaxis]/tot_value))**n_values
final2 = [np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value))**i for i in n_values]
我的问题是,我想使用Numpy(final
)来模拟在final2
中看到的循环,这是由于获得更大数组时的速度。但是输出是不一样的,我一直在尝试不同的东西,但我似乎不知道怎么做,如果可能的话
final
的输出为:
[275.3622303 16.59404201 16.59404201]
它应该位于final2
中的位置:
[6.7290539608469775, 7.0, 7.0]
也许我对此视而不见,但我就是不知道该怎么做。你可以通过广播来做到这一点:
np.sum(
(x[None, :] ** (1 / n_values[:, None])) * (y[None, :] / tot_value),
axis=1
) ** n_values
只需将数组直接用于同一表达式并沿第一个轴求和即可-
i = n_values
out = np.sum((x[:, np.newaxis]**(1/i))*(y[:, np.newaxis]/tot_value),axis=0)**i
另一个和更高性能的是einsum
-
out = np.einsum('ij,ij->j',x[:, np.newaxis]**(1/i),y[:, np.newaxis]/tot_value)**i
矩阵乘法-
out = (y/tot_value).dot(x[:, np.newaxis]**(1/i))**i
啊,对不起,我弄错了。这应该是
n_值
。它已经更新了。啊,所以我只缺少了axis=0属性。好了,给你:)