用布尔数组建立索引

时间:2020-05-11 20:18:53

标签: python numpy numpy-ndarray numpy-slicing

a = np.arange(12).reshape(3,4)

b1 = np.array([False,True,True]

b2 = np.array([True,False,True,False])

a[b1,b2]

输出:

array([4,10])

我在a [b1,b2]中没有得到4和10的结果

3 个答案:

答案 0 :(得分:3)

您显然希望看到array([[ 4, 6],[ 8, 10]])

在布尔索引中,NumPy仅返回here中所述的对角元素:

在没有np.ix_调用的情况下,只会选择对角线元素(...)。对于使用多个高级索引建立索引,这一点是最重要的。

对于所需的输出,请使用np.ix_()

a[np.ix_(b1,b2)]

答案 1 :(得分:1)

public static int[] getSwap(int[] input) {
    int[] output = new int[input.length];
    for (int i = 0; i + 1 < input.length; i += 2) {
        int j = i + 1;
        output[i] = input[j];
        output[j] = input[i];
    }
    return output;
}

第一件事是您已经排列了12个数组元素,这些数组元素从0开始,以1步进,以12结束。 然后,您已经用3行4列重塑了数组元素。 如下所示:

import numpy as np
a = np.arange(12).reshape(3, 4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
print(a)
print(a[b1, b2])

然后最后打印带有行和列的数组元素,因为该数组是二维数组,它具有行和列。\ b1代表具有三行的元素的行,并且第一行(row [0])为False。 第二行(row [1])为True。...最后一行(row [2])为True。 b2还表示具有4列的数组的列。第一列(column [0])为True ...第三列(column [2])为True。 最后是假。 然后,当我们想返回二维数组的输出时,我们使用数组名(a [b1,b2]),b1和b2是行索引和列索引。

第二行和第一列变为True。因此它返回4。其他为False。第三行和第三列也变为True。因此,它返回10。其他为False。

这是我的理解。 对不起,我的英语不好。

答案 2 :(得分:-2)

正确的解释是here。总结一下,

a[b1,b2]和布尔数组b1b2等效于a[b1.nonzero(),b2.nonzero()]

nonzero()返回True值的索引。因此,

b1.nonzero()=(array([1, 2]),)
b2.nonzero()=(array([0, 2]),)

因此,现在,我们正在使用数组建立索引。与基于数组的索引一样,将返回[1,0]th的{​​{1}}元素和4的{​​{1}}元素。