数组结束后的 Numpy 奇怪行为

Posted

技术标签:

【中文标题】数组结束后的 Numpy 奇怪行为【英文标题】:Numpy strange behavior past end of array 【发布时间】:2020-01-14 18:19:57 【问题描述】:

通常,如果您尝试在 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)

为什么会这样?这里怎么可能不出错?这种行为是否记录在案,还是一个错误?

【问题讨论】:

【参考方案1】:

为了与 Python 列表行为保持一致,您可以在末端进行切片。第一个案例表明 LHS 和 RHS 都是如此。

其余的是广播。 3 不能进入 2。2 不能进入 0。但是 1 可以进入任何东西,包括 0。我们倾向于认为广播将 1 尺寸复制到更大的尺寸,但复制到 0 也可以。

【讨论】:

这当然解释了一切。我认为这非常违背返回预期结果的整个想法,但这是完全不同的事情。

以上是关于数组结束后的 Numpy 奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

处理numpy数组时赋值运算符中的指针行为?

Pyspark Struct 列:爆炸后的奇怪行为

Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组split函数垂直拆分二维numpy数组

MinMaxScaler 在任何 NumPy 数组上显示奇怪的输出

Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组split函数水平(按列)拆分二维numpy数组

将一个 numpy 数组附加到一个列表 - 奇怪的事情