gpt4 book ai didi

python - 给定索引列表的数组的部分求和

转载 作者:行者123 更新时间:2023-11-28 22:43:01 25 4
gpt4 key购买 nike

我有一个二维矩阵,我需要对矩阵元素的一个子集求和,给定两个索引列表 imp_listbath_list。这是我现在正在做的事情:

s = 0.0
for i in imp_list:
for j in bath_list:
s += K[i,j]

这看起来很慢。执行求和的更好解决方案是什么?

最佳答案

如果您正在处理大型数组,通过使用 NumPy 自己的索引例程而不是 Python 的 for 循环,您应该会获得巨大的速度提升。

在一般情况下,您可以使用 np.ix_ 选择要求和的矩阵子数组:

K[np.ix_(imp_list, bath_list)].sum()

请注意 np.ix_ 会带来一些开销,因此如果您的两个列表包含连续或均匀间隔的值,则值得使用常规切片来索引数组(参见 method3() 下面)。

这里有一些数据可以说明这些改进:

K = np.arange(1000000).reshape(1000, 1000)
imp_list = range(100) # [0, 1, 2, ..., 99]
bath_list = range(200) # [0, 1, 2, ..., 199]

def method1():
s = 0
for i in imp_list:
for j in bath_list:
s += K[i,j]
return s

def method2():
return K[np.ix_(imp_list, bath_list)].sum()

def method3():
return K[:100, :200].sum()

然后:

In [80]: method1() == method2() == method3()
Out[80]: True

In [91]: %timeit method1()
10 loops, best of 3: 9.93 ms per loop

In [92]: %timeit method2()
1000 loops, best of 3: 884 µs per loop

In [93]: %timeit method3()
10000 loops, best of 3: 34 µs per loop

关于python - 给定索引列表的数组的部分求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31273995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com