numpy在给数组边界外赋值时到底在做什么?它是否会导致当前被其他东西使用的内存区域出现问题?在本例中,它将行9写入所有1。我希望用它来绕过一个边缘情况,但我在numpy页面上找不到任何关于此行为的文档,用于分配或广播。
import numpy as np x = np.zeros([10, 5]) x[9:11] = 1
根据“解决了这个问题”编辑:我知道它在做什么以及它是如何工作的。我仍然有一个问题是,是否有内存损坏的风险,或者在写入/分配时是否忽略了不存在的切片索引。
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行。人们可能会争论这是否是一件好事。但是如果您担心溢出操作,则需要自己检查维度。
x[9:11] = 1
1
1条答案
按热度按时间6jjcrrmo1#
从numpy docs切片和大步
你可以使用切片来设置数组中的值,但是(与列表不同)你永远不能增长数组。在x[obj] = value中设置的值的大小必须与x[obj]的形状相同(可广播到)。
在索引时,numpy努力在获取和设置值之间保持对称。如果当你获取一个值时,一个切片溢出了一个列表,那么它不会被考虑,并且错误:
类似地,当你分配一个切片时,numpy会删除任何可能溢出的东西。对于
x[9:11] = 1
,numpy选择了不会溢出底层缓冲区的单行,并广播1
。Numpy减少了赋值的范围,并且没有溢出。在你的例子中,你想分配2行,但是numpy修改了你的分配,只设置了1行。人们可能会争论这是否是一件好事。但是如果您担心溢出操作,则需要自己检查维度。