【发布时间】:2019-01-30 13:56:24
【问题描述】:
我有一个 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,它们附加到列表 lst_a 和 lst_b 中,稍后在 for 循环中使用。
在循环中,从 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 达到数组的长度时,整个循环结束。
因为数组有数百万行,所以需要很长时间才能完成。这个过程可以向量化吗?如何向量化?
【问题讨论】:
-
你能解释一下你的函数是做什么的吗?
-
@Akshay Nevrekar 功能已添加,谢谢
-
抱歉,我可能不够清楚,但我希望您提供函数背后的逻辑以及输入和预期输出(不是逐行解释)。如果你提供,你会得到更好的回应。 How to ask question on SO