numpy在赋值超过数组维数时做了什么?

z8dt9xmd  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(70)

numpy在给数组边界外赋值时到底在做什么?它是否会导致当前被其他东西使用的内存区域出现问题?
在本例中,它将行9写入所有1。我希望用它来绕过一个边缘情况,但我在numpy页面上找不到任何关于此行为的文档,用于分配或广播。

import numpy as np
x = np.zeros([10, 5])
x[9:11] = 1

根据“解决了这个问题”编辑:我知道它在做什么以及它是如何工作的。我仍然有一个问题是,是否有内存损坏的风险,或者在写入/分配时是否忽略了不存在的切片索引。

6jjcrrmo

6jjcrrmo1#

从numpy docs切片和大步
你可以使用切片来设置数组中的值,但是(与列表不同)你永远不能增长数组。在x[obj] = value中设置的值的大小必须与x[obj]的形状相同(可广播到)。
在索引时,numpy努力在获取和设置值之间保持对称。如果当你获取一个值时,一个切片溢出了一个列表,那么它不会被考虑,并且错误:

>>> l = [1,2,3]
>>> l[1:99]
[2, 3]

类似地,当你分配一个切片时,numpy会删除任何可能溢出的东西。对于x[9:11] = 1,numpy选择了不会溢出底层缓冲区的单行,并广播1。Numpy减少了赋值的范围,并且没有溢出。在你的例子中,你想分配2行,但是numpy修改了你的分配,只设置了1行。
人们可能会争论这是否是一件好事。但是如果您担心溢出操作,则需要自己检查维度。

相关问题