用布尔附加numpy数组

JRR*_*JRR 5 python numpy

有人可以解释这段代码在做什么吗?

   a = np.array([[1, 2], [3, 4]])
   a[..., [True, False]]
Run Code Online (Sandbox Code Playgroud)

在那[True, False]做什么?

en_*_*ght 1

省略号表示法和布尔值作为整数

来自 numpy 文档

省略号扩展为 : 生成与 x.ndim 长度相同的选择元组所需的对象的数量。可能只存在一个省略号

True并且False 只是混淆了 0 和 1。以文档中的示例为例:

x = np.array([[[1],[2],[3]], [[4],[5],[6]]])
x[...,0]
# outputs: array([[1, 2, 3],
#       [4, 5, 6]])
x[..., False] # same thing
Run Code Online (Sandbox Code Playgroud)

布尔值指定索引,就像数字 0 或 1 一样。


回答你在评论中提出的问题

首先看起来很神奇

a = np.array([[1, 2], [3, 4]])
a[..., [True, True]]  # = [[2,2],[4,4]]
Run Code Online (Sandbox Code Playgroud)

但当我们将其视为

a[..., [1,1]] # = [[2,2],[4,4]]
Run Code Online (Sandbox Code Playgroud)

似乎不太令人印象深刻。

相似地:

b = array([[1,2,3],[4,5,6]])
b[...,[2,2]] # = [[3,3],[5,5]]
Run Code Online (Sandbox Code Playgroud)

应用省略规则后;true 和 false 抓取列索引,就像 0、1 或 17 一样


用于复杂索引的布尔数组

有一些细微的差别(布尔类型与整数类型不同)。许多复杂的细节都可以在这里找到。这些似乎在您的代码中没有任何作用,但它们对于弄清楚 numpy 索引的工作原理很有趣。

特别是,这一行可能就是您正在寻找的:

将来,类布尔数组(例如 python 布尔列表)将始终被视为布尔索引

在此页面上,他们讨论了布尔数组,作为索引工具,布尔数组非常复杂

用作索引的布尔数组的处理方式与索引数组完全不同。布尔数组的形状必须与索引数组的初始维度相同

稍微往下跳一点

与整数索引数组的情况不同,在布尔情况下,结果是一个一维数组,其中包含索引数组中与布尔数组中所有 true 元素相对应的所有元素。索引数组中的元素始终按行优先(C 样式)顺序迭代和返回。结果也与 y[np.nonzero(b)] 相同。与索引数组一样,返回的是数据的副本,而不是切片获取的视图。