我有以下虚拟数据:

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]


也许我对此视而不见,但是我只是看不到该怎么做。

最佳答案

只需将数组直接用于相同的表达式并沿第一个轴求和-

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


matrix-multiplication还有更多-

out = (y/tot_value).dot(x[:, np.newaxis]**(1/i))**i

关于python - 使用Numpy代替循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52184885/

10-12 21:10