jgo*_*mo3 4 python numpy scipy
这个例子
有关为索引数组赋值的文档显示了一个对那些天真的程序员有意想不到的结果的例子.
>>> 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])
Run Code Online (Sandbox Code Playgroud)
文档说人们可以天真地期望数组的值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])
Run Code Online (Sandbox Code Playgroud)
问题
第一:
原始示例中发生了什么?有人可以详细解释一下吗?
第二:
这是一个记录在案的行为,我很好.但我认为它应该像我描述的那样表现,因为从Python的角度来看是预期的.所以,仅仅因为我想要被说服:它有一个很好的理由,就像它对"我预期的"行为一样吗?
问题是你提供的第二个例子与第一个例子不同.如果你看一下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])
Run Code Online (Sandbox Code Playgroud)
在示例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])
Run Code Online (Sandbox Code Playgroud)