【问题标题】:Indexing ndarray by ndarray通过 ndarray 索引 ndarray
【发布时间】:2019-07-23 12:10:35
【问题描述】:

我有一个第一个 ndarray,foo,我想在其中选择几个元素。

foo = array([0, 10, 30] , [20, 40, 60], [30, 50, 70])

确切地说,我有另一个 ndarray,bar,我在其中存储我想要的行在我的第一个 ndarray 的每一列中。

bar = array([1, 2, 0], [0, 0, 1])

我想要的结果是:

array([20, 50, 30] , [0, 10, 60])

这是一种矢量化的方式吗?

当我尝试 foo[bar] 时,它会增加数组的大小。 这不是我想要的。

【问题讨论】:

    标签: python python-3.x indexing numpy-ndarray


    【解决方案1】:
    In [17]: foo[bar, np.arange(3)]
    Out[17]: 
    array([[20, 50, 30],
           [ 0, 10, 60]])
    

    一维数组np.arange(3)被广播成和bar一样的形状 所以它相当于

    In [35]: X, Y = np.broadcast_arrays(bar, np.arange(3)); Y
    Out[35]: 
    array([[0, 1, 2],
           [0, 1, 2]])
    

    Xbar 相同,因为广播不会改变bar 的形状。

    然后NumPy integer array indexing rulesfoo[X, Y](i,j) 元素等于

    foo[X, Y][i, j] = foo[X[i,j], Y[i,j]]
    

    例如,

    foo[bar, np.arange(3)][0, 1] = foo[ bar[0,1],  Y[0,1] ]
                                 = foo[2, 1]
                                 = 50 
    

    【讨论】:

    • 非常感谢您的回答!效果很好
    【解决方案2】:

    您还需要分别指定要与每个索引一起使用的列。

    试试这个:

    import numpy as np
    
    foo = np.array([[0, 10, 30], [20, 40, 60], [30, 50, 70]])
    bar = np.array([[1, 2, 0], [0, 0, 1]])
    
    foo[bar, range(len(foo))]
    

    输出:

    array([[20, 50, 30],
           [ 0, 10, 60]])
    
    

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 2018-10-10
    • 2022-10-06
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多