NumPy数组中的列表索引多切片

5

Numpy数组可以接受一个索引列表,例如

a = np.arange(1000)
l = list([1,44,66,33,90,345])
a[l] = 22

但是如果我们想要使用多个切片索引或索引加切片,那么这种方法就不起作用了。

a = np.arange(1000)
l = list([1,44,66,33,90, slice(200,300) , slice(500,600) ])
a[l] = 22

这段代码返回一个错误信息:

IndexError: too many indices

我的问题很简单: 您是否知道在 numpyscipy 中是否存在一种有效的方法来使用这种类型的索引? 或者有没有一种好的、高效的方式来使用类似这样的索引方法? 不要忘记,使用切片可以产生非常快速的代码;而我的问题是尽可能地使代码更快。

了解如何循环遍历这个问题是有帮助的。你在开始时知道什么,每次迭代中只知道什么?问题还有哪些其他限制条件? - Henry Gomersall
2个回答

4

我的想法是:

a = np.arange(1000)
l = np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600)))
a[l] = 22

我不确定这是否是最简单的方法,但它可以工作。
编辑:你说得对,这比使用切片慢;但是你不能创建具有任意值的切片对象。也许你应该只做几个赋值操作:
%timeit a[np.hstack(([1, 44, 66, 33, 90], np.arange(200, 300), np.arange(500, 600)))] = 22
10000 loops, best of 3: 39.5 us per loop

%timeit a[[1, 44, 66, 33, 90]] = 22; a[200:300] = 22; a[500:600] = 22
100000 loops, best of 3: 18.4 us per loop

但是这种方法不使用切片,而切片相对于数组索引非常快。它可以工作,但效率不高。 - Giggi
@Giggi 正确;已编辑。虽然我不知道是否有办法实现您想要的功能。 - Lev Levitsky

0

你可以使用高级索引来构建索引列表。

l = numpy.array([1,44,66,33,90]+range(200,300)+range(500,600))
a[l] = 22

但是正如@Lev指出的那样,这可能不会更快(尽管如果您可以预先计算索引列表,则几乎肯定会更快)。

但是,花式索引逐轴应用。因此,如果有帮助的话,您可以在一个轴上进行花式索引,并对其他轴进行切片:

a = numpy.random.randn(4, 5, 6)
l = numpy.array([1, 2])
a[l, slice(None), slice(2, 4)] = 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接