如何将这个循环向量化?
我有一个numpy数组,如下所示:
array([[ -1. , 184. , 0.5],
[ -1. , 174. , 1.0],
[ -1. , 104. , 0.5],
[ 1. , 44. , 0.5],
[ 1. , 28. , 0.5],
[ 1. , 70. , 0.5],
[ -1. , 34. , 0.5],
...,
[ 1. , 10. , 0.5],
[ 1. , 12. , 0.5],
[ 1. , 86. , 1.0],
[ -1. , 36. , 0.5],
[ 1. , 2. , 0.5],
[ -1. , 32. , 1.5],
[ 1. , 10. , 0.5]])
我有一个函数来查找满足for循环中列出的条件的数组的索引:
def loop(array):
n_init = 100
a = np.dot(array[:n_init, 0], array[:n_init, 1])
b = np.sum(array[:n_init, 2])
loc_start = n_init
idx = []
lst_a, lst_b = [], []
lst_a.append(a)
lst_b.append(b)
for step in range(n_init + 1, array.shape[0]):
mean_a = np.mean(lst_a)
mean_b = np.mean(lst_b)
_a = np.dot(array[loc_start:step, 0], array[loc_start:step, 1])
_b = np.sum(array[loc_start:step, 2])
if np.abs(_a) * _b >= np.abs(mean_a) * mean_b:
loc_start = step
lst_a.append(_a)
lst_b.append(_b)
idx.append(step)
return idx
该函数首先初始化n_init行,以便计算2个标量a和b,这两个标量被附加到稍后在for循环中使用的列表lst_a和lst_b中。
在循环中,从紧接n_init行之后的条目开始,计算lst_a和lst_b的平均值,以及_a (从最后一个idx到当前步骤的列0和1的点操作)和_b (从最后一个idx到当前步骤的列2的和)的值。
当_a乘以_b的绝对值大于或等于lst_a的平均值乘以lst_b的平均值的绝对值时,找到行号,即附加到idx的索引,并且当满足条件时,将当前的_a和_b分别附加到lst_a和lst_b。当step达到数组的长度时,整个循环结束。
因为数组有数百万行,所以需要很长时间才能完成。这个过程可以矢量化吗?如何实现?
转载请注明出处:http://www.intsu.net/article/20230502/1958886.html