理解通过布尔向量的否定进行子集化时的numpy行为

s1ag04yj  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(108)

我在观察一些奇怪的行为我想弄明白。
不幸的是,我没有具体的例子,因为我不能分享我的数据。用b我创建了一个随机布尔值的2d矩阵。

import numpy as np

a = np.random.normal(size=(10000, 12, 1000))
p = 0.5
b = np.random.choice(a=[False, True], size=(a.shape[0], a.shape[1]), p=[p, 1-p])

a[b].shape
(60037, 1000)

a[~b].shape
(59963, 1000)

这是我们所期望看到的。然而,在我的实际数据集中,其中A也有3维,B也是布尔2维,当我
a[~b].shape
结果是一个2维向量,在第0维中有大约12倍多的行。与a的输入维(104529,12,11)和b的输入维(104529,12)相比,输出I为1.61M X 11。
当我在b上进行子集划分时,我们确实看到了一些看起来合理的东西:

a[b].shape
(85472, 11)

一些奇怪结果的证据:

cigdeys3

cigdeys31#

你看到的行为在numpy索引指南中有描述,因为你的掩码b的形状是(104529, 12),我们可以预期a[b]的结果最多有104529 * 12 = 1254348个条目,如果掩码处处为True,就会发生这种情况。
这个值大于1168876,所以你的结果是合理的。事实上,这意味着你的掩码b里面正好有1168876个True值。注意1254348 - 1168876 = 85472,这是你用~b索引时得到的结果数;)

相关问题