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属性。好了,给你:)