用布尔附加numpy数组

时间:2016-06-16 03:41:20

标签: python numpy

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

   a = np.array([[1, 2], [3, 4]])
   a[..., [True, False]]

[True, False]在那里做什么?

1 个答案:

答案 0 :(得分:1)

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

From the numpy docs

  

省略号扩展到以下数量:制作与x.ndim相同长度的选择元组所需的对象。可能只有一个省略号

TrueFalse are just obfuscated 0 and 1。以文档为例:

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

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

回复评论中的问题

首先看起来很神奇

a = np.array([[1, 2], [3, 4]])
a[..., [True, True]]  # = [[2,2],[4,4]]

但是当我们将其视为

a[..., [1,1]] # = [[2,2],[4,4]]

似乎不太令人印象深刻。

类似地:

b = array([[1,2,3],[4,5,6]])
b[...,[2,2]] # = [[3,3],[5,5]]

应用省略号规则后;真假抓取列索引,就像0,1或17一样

复杂索引的布尔数组

存在一些微妙的差异(bool的类型与int不同)。 A lot of the hairy details can be found here。这些似乎没有代码中的任何内容,但它们很有趣,可以确定numpy索引的工作原理。

特别是,这条线可能是您正在寻找的:

  

将来布尔数组喜欢(比如python bools列表)会   始终被视为布尔索引

On this page,他们谈论布尔数组,它们作为索引工具非常复杂

  

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

稍微减少

  

与整数索引数组的情况不同,在布尔情况下,   result是包含索引数组中所有元素的1-D数组   对应于布尔数组中的所有真实元素。该   索引数组中的元素总是被迭代并返回   行主(C风格)顺序。结果也是一样的   Y [np.nonzero(B)]。与索引数组一样,返回的是副本   数据,而非用切片获取的视图。