如何同时索引数组和切片numpy数组

时间:2014-03-28 09:00:39

标签: python numpy

我有一个带索引的向量和带值的向量。

对于索引向量中的每个索引,我需要在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]]

我的索引和值数组很大,循环需要太多时间。 有没有办法在循环中做到这一点?

2 个答案:

答案 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)