numpy数组的列表索引中的多个切片

时间:2012-11-23 08:20:19

标签: python arrays numpy indexing

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

我的问题非常简单: 你知道吗?在 numpy scipy 中是否存在使用这种索引的有效方法?

或者使用像这样的索引方法有什么好方法?

不要忘记切片的使用会产生非常快的代码;我的问题是尽可能快地编写代码。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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