Numpy 数组和列表的多重赋值,一个奇怪的例子
Multiple assignment with Numpy arrays and lists, a curious example
考虑多重赋值 x[0],y = y,x[0]
。应用于以下四种情况中的每一种,都会给出四种不同的结果。
案例一:
x = [[1,2], [3,4]]
y = [5,6]
给予
x = [[5,6], [3,4]]
y = [1,2]
案例二:
x = np.array([[1,2], [3,4]])
y = [5,6]
给予
x = array([[5,6], [3,4]])
y = array([5,6])
案例三:
x = [[1,2], [3,4]]
y = np.array([5,6])
给予
x = [array([5,6]), [3,4]]
y = [1,2]
案例四:
x = np.array([[1,2], [3,4]])
y = np.array([5,6])
给予
x = array([[5,6], [3,4]])
y = array([5,6])
列表的多重赋值似乎比 Numpy 数组的多重赋值更聪明(自动通过临时变量)。
想法?
编辑:毕竟不是更聪明...
x[0],y = y,x[0]
等于
t = x[0]
x[0] = y
y = t
正如@Scimonster 指出的那样,
When assigning into a Numpy array, it turns that into part of the
Numpy array.
所以这是正常行为。
这里唯一令人惊讶的情况应该是 2 和 4:
x = np.array([[1,2], [3,4]])
y = np.array([5,6]) # or [5, 6]
给予
x = array([[5,6], [3,4]])
y = array([5,6]) # where did the 1 and 2 go?
因为其他人只是交换数据类型,但保持相同的值。
使用 numpy 的不同之处在于 x[0]
returns 视图,而不是副本。因此,即使在元组赋值中写出临时值也会显式失败:
temp = x[0]
x[0] = y
y = temp
因为 temp
是一个始终与 x[0]
相同的视图,而不是 x[0]
在那个时间点的值的副本。
为了使这个适用于 numpy 的情况,你应该使用 x[0],y = y,x[0].copy()
考虑多重赋值 x[0],y = y,x[0]
。应用于以下四种情况中的每一种,都会给出四种不同的结果。
案例一:
x = [[1,2], [3,4]] y = [5,6]
给予
x = [[5,6], [3,4]] y = [1,2]
案例二:
x = np.array([[1,2], [3,4]]) y = [5,6]
给予
x = array([[5,6], [3,4]]) y = array([5,6])
案例三:
x = [[1,2], [3,4]] y = np.array([5,6])
给予
x = [array([5,6]), [3,4]] y = [1,2]
案例四:
x = np.array([[1,2], [3,4]]) y = np.array([5,6])
给予
x = array([[5,6], [3,4]]) y = array([5,6])
列表的多重赋值似乎比 Numpy 数组的多重赋值更聪明(自动通过临时变量)。
想法?
编辑:毕竟不是更聪明...
x[0],y = y,x[0]
等于
t = x[0]
x[0] = y
y = t
正如@Scimonster 指出的那样,
When assigning into a Numpy array, it turns that into part of the Numpy array.
所以这是正常行为。
这里唯一令人惊讶的情况应该是 2 和 4:
x = np.array([[1,2], [3,4]])
y = np.array([5,6]) # or [5, 6]
给予
x = array([[5,6], [3,4]])
y = array([5,6]) # where did the 1 and 2 go?
因为其他人只是交换数据类型,但保持相同的值。
使用 numpy 的不同之处在于 x[0]
returns 视图,而不是副本。因此,即使在元组赋值中写出临时值也会显式失败:
temp = x[0]
x[0] = y
y = temp
因为 temp
是一个始终与 x[0]
相同的视图,而不是 x[0]
在那个时间点的值的副本。
为了使这个适用于 numpy 的情况,你应该使用 x[0],y = y,x[0].copy()