【问题标题】:Why does the order of dimensions change with boolean indexing?为什么维度的顺序会随着布尔索引而变化?
【发布时间】:2015-04-05 19:14:00
【问题描述】:

当我们有一个形状为(a, b, c)M 和一个用于索引最后一个数组的索引数组v 时,为什么M[i, :, v] 会生成一个形状为(d, b) 的数组(带有d v) 中的真值数量?如下图:

In [409]: M = zeros((100, 20, 40))

In [410]: val = ones(shape=(40,), dtype="bool")

In [411]: M[0, :, :].shape
Out[411]: (20, 40)  # As expected

In [412]: M[0, :, val].shape
Out[412]: (40, 20)  # Huh?  Why (40, 20), not (20, 40)?

In [413]: M[:, :, val].shape
Out[413]: (100, 20, 40)  # s expected again

为什么M[0, :, val] 的形状是(40, 20) 而不是(20, 40)

【问题讨论】:

  • Boolean Indexing 的文档涵盖了您的示例 - 但我还没有弄清楚它的含义。
  • @BiRico 哎呀,确实。已更正。
  • @wwii 我通读了一遍,但我没有找到他们使用最后一个维度而不是第一个维度来进行布尔索引的示例。

标签: python arrays numpy indexing boolean


【解决方案1】:

根据文档的boolean indexing 部分 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing

使用 obj.nonzero() 类比可以最好地理解组合多个布尔索引数组或布尔值与整数索引数组。

ind = np.nonzero(val)[0]
# array([ 0,  1,  2, ...., 39], dtype=int32)
M[0, :, ind].shape   # (40,20)

现在我们进入关于结合高级和基本索引的部分 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

这是一种形式:x[arr1, :, arr2]

在第一种情况下,高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。

所以0ind 部分产生(40,) 选择,而中间的: 产生(20,)。通过将: 部分放在最后,生成的维度为(40,20)。基本上它这样做是因为这种索引样式存在歧义,因此它始终选择将切片部分放在末尾。

选择这些值并保持(或多或少)所需形状的一种方法是使用np.ix_ 生成索引元组。

M[np.ix_([0],np.arange(20),ind)].shape # (1, 20, 40)

您可以使用np.squeeze 删除初始的1 维度。

ix_ 的这种用法在“纯索引数组索引”部分的末尾进行了说明 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing

【讨论】:

  • 对。在我的实际用例中,我也在分配值。我看到有一些关于返回数组何时是副本以及何时是视图的警告,但似乎在使用 ix_ 时我确实得到了视图。
  • 您看不到视图,但分配 arr[foo] = b 始终有效。但是,arr[foo][bar] = b 等价于 tmp = arr[foo]; tmp[bar] = b,如果 tmp 不是 arr 上的视图,则不会执行任何操作。
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 2021-08-22
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多