我有一个带索引的向量和带值的向量。
对于索引向量中的每个索引,我需要在numpy数组reslts中有效地生成一行
结果数组中的行需要包含值中的索引的先前值,索引值和两个下一个值。
以下是我使用循环执行此操作的方法:
import numpy as np indexes = np.array([5,10,12]) values = np.array([ 0.89643977, 0.50794841, 0.75995795, 0.78029348, 0.83609961, 0.47534985, 0.17330516, 0.15152753, 0.15504392, 0.10245308, 0.70428183, 0.36804107, 0.13074141, 0.77377332, 0.11368238, 0.74711745, 0.89431082, 0.35544423, 0.08592396, 0.28762 ]) result = values[indexes[0] -1:index[0] -1 + 4] for index in indexes[1:]: result = numpy.vstack([result, values[index -1:index -1 + 4]]) print result [[ 0.83609961 0.47534985 0.17330516 0.15152753] [ 0.10245308 0.70428183 0.36804107 0.13074141] [ 0.36804107 0.13074141 0.77377332 0.11368238]]
我的索引和值数组很大,循环需要太多时间。 有没有办法在循环中做到这一点?
答案 0 :(得分:2)
只要没有索引超出范围,这将有效,并且应该更快:
In [4]: idx = indexes[:, None] + np.arange(-1, 3)
In [5]: values[idx]
Out[5]:
array([[ 0.83609961, 0.47534985, 0.17330516, 0.15152753],
[ 0.10245308, 0.70428183, 0.36804107, 0.13074141],
[ 0.36804107, 0.13074141, 0.77377332, 0.11368238]])
答案 1 :(得分:1)
您选择values[index -1:][:4]
超过values[index -1: index -1 + 4]
是否有任何理由?另外我的猜测是你想要在列表中收集所有结果然后np.vstack而不是在循环中这样做。等待更好的答案,您可以考虑使用:
ls_results = [values[index -1:index -1 + 4] for index in indexes]
result = np.vstack(ls_results)