【发布时间】:2017-08-03 19:44:36
【问题描述】:
假设我有一个数组x = np.arange(6).reshape(3, 2)。
x[False]或x[np.asanyarray(False)]是什么意思?两者都导致array([], shape=(0, 3, 2), dtype=int64),这是出乎意料的。
我希望得到一个IndexError,因为面具尺寸不正确,比如x[np.ones((2, 2), dtype=np.bool)]。
这种行为对于x[True] 和x[np.asanyarray(True)] 是一致的,因为两者都会产生一个额外的维度:array([[[0, 1], [2, 3], [4, 5]]])。
我正在使用 numpy 1.13.1。最近这种行为似乎发生了变化,因此虽然很高兴为旧版本提供答案,但请在答案中提及您的版本。
编辑
为了完整起见,我根据对此问题的评论提交了https://github.com/numpy/numpy/issues/9515。
编辑 2
并且几乎立即关闭它。
【问题讨论】:
-
您使用的是哪个 NumPy 版本?结果我得到
array([0, 1])。这是因为False被视为0,-->x[0](在 1.11.3 中) -
@BradSolomon 在上一个版本中进行了更改:docs.scipy.org/doc/numpy-dev/… (标量数组的布尔索引返回一个新的一维数组。这意味着 array(1)[array(True) ] 给出 array([1]) 而不是原始数组。)
-
@BradSolomon。版本 1.13.1,
False将被视为整数,除非您传入一个布尔矩阵,如我在预期示例中所示。我对x[False] == x[0]的想法很满意,但对x[np.array(False)] == x[0]不太满意。似乎都没有发生。 -
@ayhan:不,这是不同的变化。
-
@ayhan:这里的相关部分比你引用的部分高一点:“布尔标量(包括python True)是合法的布尔索引,从不被视为整数。”