【问题标题】:Python numpy Indexing multidimensional array [duplicate]Python numpy索引多维数组[重复]
【发布时间】:2018-11-12 10:32:31
【问题描述】:

对于y 的每一行,我想获取其索引在m 中指定的元素。

>>> y = np.arange(15).reshape(3,5)
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

>>> m = np.array([[0, 1], [1, 2], [2, 3]])

预期输出:

[[0, 1]
 [6, 7]
 [12, 13]]

for 循环解决方案

>>> np.stack([y[i, cols] for i, cols in enumerate(m)])

有没有办法在没有for 循环的情况下做到这一点?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    使用一个数组中的值作为另一个数组的索引称为“花式索引”,但是该索引操作将针对所有行重复:

    y = numpy.arange(15).reshape(3,5)
    y[:, [0, 2, 3]]
    # array([[ 0,  2,  3],
    #        [ 5,  7,  8],
    #        [10, 12, 13]])
    

    如果您想单独“每行使用一个索引值”,则需要将该行与索引的关系作为另一个索引:

    y[[0, 1, 2], [0, 2, 3]]
    # array([ 0,  7, 13])
    

    由于您的索引数组m 是二维的,您需要告诉NumPy m 中的这两个维度中的哪一个对应于您的行索引。为此,您可以通过在升序索引中添加另一个空轴(关键字:广播),然后得到

    y = numpy.arange(15).reshape(3,5)
    m = numpy.array([[0, 1], [1, 2], [2, 3]])
    
    y[numpy.arange(len(m))[:, None], m]
    # array([[ 0,  1],
    #        [ 6,  7],
    #        [12, 13]])
    

    【讨论】:

      【解决方案2】:

      一行,虽然并不比你自己使用 for 循环的建议好多少:

      y[..., m][np.identity(3, dtype=bool)]
      

      虽然它会给你一些关于 numpy 索引的见解。

      【讨论】: