python - 数组结束后的 Numpy 奇怪行为
问题描述
通常,如果您尝试在 numpy 中分配数组的末尾,则不存在的元素将被忽略。
>>> x = np.zeros(5)
>>> x[3:6] = np.arange(5)[2:5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3) into shape (2)
但是,如果只分配了一个元素,则完全超出数组末尾的相同操作会“成功”:
>>> x[5:] = np.arange(5)[4:]
>>> x[5:] = np.arange(5)[4:100]
这仅在 RHS 具有一个元素时才有效:
>>> x[5:] = np.arange(5)[3:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (2) into shape (0)
为什么会这样?这里怎么可能不出错?这种行为是否记录在案,还是一个错误?
解决方案
为了与 Python 列表行为保持一致,您可以直接切片。第一个案例表明 LHS 和 RHS 都是如此。
剩下的就是广播。3 不能进入 2。2 不能进入 0。但是 1 可以进入任何东西,包括 0。我们倾向于认为广播将 1 尺寸复制到更大的尺寸,但复制到 0 也可以。