4

这个例子

关于为索引数组赋值的文档为那些天真的程序员展示了一个带有意外结果的示例。

>>> x = np.arange(0, 50, 10)
>>> x
array([ 0, 10, 20, 30, 40])
>>> x[np.array([1, 1, 3, 1])] += 1
>>> x
array([ 0, 11, 20, 31, 40])

文档说人们可以天真地期望数组的值x[1]+1增加三倍,但实际上它被分配了x[1]三倍。

问题

真正让我感到困惑的是,我所期望的是操作的x += 1行为就像它在普通 Python 中所做的那样x = x + 1,所以x结果array([11, 11, 31, 11])。如本例所示:

>>> x = np.arange(0, 50, 10)
>>> x
array([ 0, 10, 20, 30, 40])
>>> x = x[np.array([1, 1, 3, 1])] + 1
>>> x
array([11, 11, 31, 11])

问题

第一的:

原始示例中发生了什么?有人可以详细解释一下吗?

第二:

这是一个记录在案的行为,我同意。但我认为它应该像我描述的那样表现,因为从 Python 主义的角度来看是预期的。所以,仅仅因为我想被说服:是否有充分的理由让它表现得像“我预期的”行为一样?

4

1 回答 1

7

问题是您给出的第二个示例与第一个示例不同。如果您x[np.array([1, 1, 3, 1])] + 1单独查看 的值,则更容易理解,numpy 在您的两个示例中都会计算该值。

的值x[np.array([1, 1, 3, 1])] + 1是您所期望的:array([11, 11, 31, 11]).

>>> x = np.arange(0, 50, 10)
>>> x
array([ 0, 10, 20, 30, 40])
>>> x[np.array([1, 1, 3, 1])] + 1
array([11, 11, 31, 11])

在示例 1 中,您将此答案分配给原始数组 x 中的元素 1 和 3。这意味着将新值 11 分配给元素 1 三次。

但是,在示例 2 中,您将原始数组 x 替换为新数组array([11, 11, 31, 11])

这是您的第一个示例的正确等效代码,并给出相同的结果。

>>> x = np.arange(0, 50, 10)
>>> x
array([ 0, 10, 20, 30, 40])
>>> x[np.array([1, 1, 3, 1])] = x[np.array([1, 1, 3, 1])] + 1
>>> x
array([ 0, 11, 20, 31, 40])
于 2013-07-17T16:50:48.127 回答