如何同时使用数组索引和切片索引NumPy数组

1 投票
2 回答
894 浏览
提问于 2025-04-18 00:17

我有一个包含索引的数组和一个包含值的数组。

对于索引数组中的每一个索引,我需要高效地在numpy数组中生成一行结果。

结果数组中的这一行需要包含索引在值数组中的前一个值、当前索引对应的值,以及接下来的两个值。

这是我用循环实现的方式:

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 个回答

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)
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]])

撰写回答