gpt4 book ai didi

python - 如何防止意外分配到空的 NumPy View

转载 作者:行者123 更新时间:2023-12-04 13:06:50 24 4
gpt4 key购买 nike

考虑以下无错误执行的 Python + NumPy 代码:

a = np.array((1, 2, 3))

a[13:17] = 23

使用超出数组限制的切片会截断切片,如果开始和停止超出限制,甚至会返回空 View 。分配给这样的切片只会丢弃输入。

在我的用例中,索引以非平凡的方式计算,并用于操作数组的选定部分。上述行为意味着如果索引计算错误,我可能会默默地跳过部分操作。这可能很难检测到,并可能导致“几乎正确”的结果,即最糟糕的编程错误。

出于这个原因,我想对切片进行严格检查,以便在数组边界之外开始或停止会触发错误。有没有办法在 NumPy 中启用它?

作为附加信息,数组很大并且操作执行得非常频繁,即应该没有性能损失。此外,数组通常是多维的,包括多维切片。

最佳答案

你可以使用 np.put_along_axis相反,这似乎符合您的需求:

>>> a = np.array((1, 2, 3))
>>> np.put_along_axis(a, indices=np.arange(13, 17), axis=0, values=23)

以上将引发以下错误:

IndexError: index 13 is out of bounds for axis 0 with size 3

参数 values 可以是标量值或另一个 NumPy 数组。

或更短的形式:

>>> np.put_along_axis(a, np.r_[13:17], 23, 0)

编辑或者np.put有一个 mode='raise' 选项(默认设置):

np.put(a, ind, v, mode='raise')

  • a: ndarray - Target array.

  • ind: array_like - Target indices, interpreted as integers.

  • v: array_like - Values to place in a at target indices. [...]

  • mode: {'raise', 'wrap', 'clip'} optional - Specifies how out-of-boundsindices will behave.

    • 'raise' – raise an error (default)
    • 'wrap' – wrap around
    • 'clip' – clip to the range

默认行为是:

>>> np.put(a, np.r_[13:17], 23)

IndexError: index 13 is out of bounds for axis 0 with size 3

mode='clip' 时,它保持沉默:

 >>> np.put(a, np.r_[13:17], 23, mode='clip')

关于python - 如何防止意外分配到空的 NumPy View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69047282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com