gpt4 book ai didi

python - 为什么维度的顺序会随着 boolean 索引而改变?

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:51 25 4
gpt4 key购买 nike

当我们有 (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 部分 http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing

Combining multiple Boolean indexing arrays or a Boolean with an integer indexing array can best be understood with the obj.nonzero() analogy.

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]

in the first case, the dimensions resulting from the advanced indexing operation come first in the result array, and the subspace dimensions after that.

所以 0ind 部分产生一个 (40,) 选择,而 : 在middle 产生一个 (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

关于python - 为什么维度的顺序会随着 boolean 索引而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com