最近自己写了个函数,实现numpy数组180度旋转的功能:
import numpy as np
def rotate(matrix):
if matrix.ndim == 2:
matrix = list(matrix)
for i in range(2):
#一次顺时针旋转90度
matrix[:] = map(list,zip(*matrix[::-1]))
return np.array(matrix)
elif matrix.ndim == 3:
for j in range(matrix.shape[0]):
matrix[j] = rotate(matrix[j])
return np.array(matrix)
weights2 = np.array(
[[[2,2,1],
[1,2,1],
[1,2,0]],
[[1,0,1],
[1,1,1],
[1,2,0]],
[[0,0,2],
[1,2,1],
[0,1,1]]])
观察一下,发现输出正确,但再次输出weights2时,发现也跟着旋转了
很好奇为啥只是作为函数输入的weights2在函数内部会被修改,后来了解到python中可变参数一般是参数引用而不是参数传值,对于一般的赋值也是如此。
比如:
matrix = weights2
print(weights2)
print(id(weights2),'\n',id(matrix))
matrix[0][0][0] = 10
print(weights2)
发现直接赋值时,两个变量的ID竟然是相同的,也就是两个变量完全等价,任意一个变量修改都会影响到另一个。试试下一种赋值方法
matrix = weights2[:]
print(weights2)
print(id(weights2),'\n',id(matrix))
matrix[0][0][0] = 10
print(weights2)
两个变量不相同,但是变量指向的元素地址却相同,所以二者还是相关联的。
再来看一种情况如下:
matrix = weights2[0]
print(weights2)
print(id(weights2),'\n',id(matrix))
matrix[0][0] = 10
print(weights2)
即使只取weights2[0]赋给matrix,但二者还是共享变量地址,因此二者还是相关联的。
如何避免两个变量相关联的情况呢,可以对原来的变量进行一些运算,因为有运算,所以会另外开辟地址保存运算结果,并将运算结果赋值给左端变量matrix,使得matrix与weights2两个变量指向的地址不再相同。
matrix = weights2 + 0
print(weights2)
print(id(weights2),'\n',id(matrix))
matrix[0][0][0] = 10
print(weights2)
这次总算实现了对matrix修改,而weights2保持不变了。
最后贴上我对rotate函数的两种修改:
def rotate(matrix):
if matrix.ndim == 2:
matrix = list(matrix)
for i in range(2):
#一次顺时针旋转90度
matrix[:] = map(list,zip(*matrix[::-1]))
return np.array(matrix)
elif matrix.ndim == 3:
matrix = matrix + 0.0
for j in range(matrix.shape[0]):
matrix[j] = rotate(matrix[j])
return np.array(matrix)
def rotate(matrix):
matrix1 = list(matrix)
if matrix.ndim == 2:
for i in range(2):
#一次顺时针旋转90度
matrix1[:] = map(list,zip(*matrix1[::-1]))
return np.array(matrix1)
elif matrix.ndim == 3:
for j in range(matrix.shape[0]):
matrix1[j] = rotate(matrix1[j])
return np.array(matrix1)
后面一种在开始就对matrix取list,因此也会另外开辟地址保存数据。