用基于自身的条件语句索引一个 numpy 数组是什么意思?

问题描述

我正在开发一个用于网络分析的大型库,遇到了一条令人困惑的线路,我不熟悉其调用约定。

    monitors = [1,2,3,4]
    nmonitors = 7 # This value is passed arbitrarily to the function

    while len(monitors) < nmonitors:
        remaining = np.arange(len(routers)) # len(routers) here is == 5
        for i in monitors:
            remaining = remaining[remaining != i]
        monitors.append(np.random.choice(remaining))

循环内部问题中的行,它通过基于 remaining 和自身的条件索引 i 数组。经过一些调试后,它似乎不仅仅是评估布尔值并使用该布尔值索引数组?

有没有人熟悉这个语法/约定并能指出我 numpy 文档的相关部分或解释?我已经搜索了几个小时,但仍然没有结果,谢谢。

解决方法

没有特殊的语法,只是结合使用条件测试生成布尔数组,并使用布尔值索引数组。

一个示例数组:

In [125]: arr = np.arange(4)
In [126]: arr
Out[126]: array([0,1,2,3])

用布尔值索引:

In [127]: arr[[True,False,True,False]]
Out[127]: array([0,2])

使用测试创建布尔值:

In [128]: (arr%2)==0
Out[128]: array([ True,False])
In [129]: arr[(arr%2)==0]
Out[129]: array([0,2])

或者像您的示例一样进行测试:

In [131]: arr!=2
Out[131]: array([ True,True])
In [132]: arr[arr!=2]
Out[132]: array([0,3])

所以内循环从 monitors 中删除所有等于 remaining 的元素,只留下 [0]?较大的循环有问题,但这与布尔索引的“语法”无关。

,

它返回一个新的布尔值数组,与原始 remaining 的维度相同。对于 remaining 的每个原始元素,只要该元素不等于 i,新数组中的等效索引就是 true