在Numpy数组索引中部分解包元组

时间:2015-03-12 12:25:09

标签: python numpy

为了解决只能逐个元素的问题,我需要将NumPy的元组索引与显式切片结合起来。

def f(shape, n):
    """
    :param shape: any shape of an array
    :type shape: tuple
    :type n: int
    """
    x = numpy.zeros( (n,) + shape )
    for i in numpy.ndindex(shape):                   # i = (k, l, ...)
        x[:, k, l, ...] = numpy.random.random(n)

x[:, *i]会产生SyntaxErrorx[:, i]会被解释为numpy.array([ x[:, k] for k in i ])。遗憾的是,由于x = numpy.zeros(shape+(n,))的进一步使用,不可能将n维作为最后一个(x[i] = numpy.random.random(n) x)。

编辑:这里有一些例子希望发表评论。

>>> n, shape = 2, (3,4)
>>> x = np.arange(24).reshape((n,)+(3,4))
>>> print(x) 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> i = (1,2)
>>> print(x[ ??? ])    # '???' expressed by i with any length is the question
array([ 6, 18])

1 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,你就会有一个多维的numpy数组,想要通过将:切片与元组i中的一些其他索引相结合来对其进行索引。

numpy数组的索引是一个元组,所以你基本上可以将这些'部分'索引组合成一个元组并将其用作索引。一个天真的方法可能看起来像这样

x[ (:,) + i ] = numpy.random.random(n) # does not work

但这会产生语法错误。而不是:,您必须使用内置的slice

x[ (slice(None),) + i ] = numpy.random.random(n)