考虑以下数组操作:
import numpy as np
def f(x):
x += 1
x = np.zeros(1)
f(x) # changes `x`
f(x[0]) # doesn't change `x`
x[0] += 1 # changes `x`
为什么x[0]
的行为不同,取决于+= 1
是发生在函数f
内部还是外部
我能否将数组的一部分传递给函数,以便函数修改原始数组?
编辑:如果我们考虑的是=
而不是+=
,我们可能会保持问题的核心,同时消除一些不相关的复杂性。
发布于 2021-12-21 23:18:36
您甚至不需要函数调用就可以看到这种差异。
x
是一个数组:
In [138]: type(x)
Out[138]: numpy.ndarray
索引数组中的元素将返回一个np.float64
对象。它实际上将数组中的值“取出来”;它不是对数组元素的引用。
In [140]: y=x[0]
In [141]: type(y)
Out[141]: numpy.float64
这个y
很像蟒蛇浮子;您可以用同样的方式进行+=
:
In [142]: y += 1
In [143]: y
Out[143]: 1.0
但是这不会改变x
In [144]: x
Out[144]: array([0.])
但这确实改变了x
In [145]: x[0] += 1
In [146]: x
Out[146]: array([1.])
y=x[0]
进行x.__getitem__
调用。x[0]=3
进行x.__setitem__
调用。+=
使用__iadd__
,但实际上类似。
另一个例子是:
改变x
In [149]: x[0] = 3
In [150]: x
Out[150]: array([3.])
但是,对y
做同样的尝试失败了:
In [151]: y[()] = 3
Traceback (most recent call last):
File "<ipython-input-151-153d89268cbc>", line 1, in <module>
y[()] = 3
TypeError: 'numpy.float64' object does not support item assignment
但y[()]
是允许的。
对带有片的数组进行basic
索引确实会产生一个可以修改的view
:
In [154]: x = np.zeros(5)
In [155]: x
Out[155]: array([0., 0., 0., 0., 0.])
In [156]: y= x[0:2]
In [157]: type(y)
Out[157]: numpy.ndarray
In [158]: y += 1
In [159]: y
Out[159]: array([1., 1.])
In [160]: x
Out[160]: array([1., 1., 0., 0., 0.])
===
Python和切取x[0]+=1
类型操作的示例:
In [405]: alist = [1,2,3]
In [406]: alist[1]+=12
In [407]: alist
Out[407]: [1, 14, 3]
In [408]: adict = {'a':32}
In [409]: adict['a'] += 12
In [410]: adict
Out[410]: {'a': 44}
__iadd__
可以被认为是一个__getitem__
,后面是一个具有相同索引的__setitem__
。
https://stackoverflow.com/questions/70441552
复制相似问题