我在下面发布了一个复制我的问题的简化代码版本:
import numpy as np
a1 = np.array([[0., (2/3)**(1/2), (1/3)**(1/2)],
[-(1/2)**(1/2), -(1/6)**(1/2), (1/3)**(1/2)],
[-(1/2)**(1/2), (1/6)**(1/2), -(1/3)**(1/2)],
[(1/2)**(1/2), -(1/6)**(1/2), (1/3)**(1/2)],
[(1/2)**(1/2), (1/6)**(1/2), -(1/3)**(1/2)],
[0., -(2/3)**(1/2), -(1/3)**(1/2)]])
b1 = np.array([[-1. , 0., 0.],
[-1/2, (3/4)**(1/2), 0.],
[1/2, -(1/12)**(1/2), -(2/3)**(1/2)],
[-1/2, -(3/4)**(1/2), 0.],
[-1/2, -(1/12)**(1/2), -(2/3)**(1/2)],
[0., (1/3)**(1/2), -(2/3)**(1/2)]])
a2 = np.array([[(1/2)**(1/2), (1/6)**(1/2), -(1/3)**(1/2)],
[0., -(2/3)**(1/2), -(1/3)**(1/2)],
[(1/2)**(1/2), -(1/6)**(1/2), (1/3)**(1/2)],
[-(1/2)**(1/2), (1/6)**(1/2), -(1/3)**(1/2)],
[0., (2/3)**(1/2), (1/3)**(1/2)],
[-(1/2)**(1/2), -(1/6)**(1/2), (1/3)**(1/2)]])
b2 = np.array([[1/2 , -(3/4)**(1/2), 0.],
[-1., 0., 0.],
[-1/2, (1/12)**(1/2), (2/3)**(1/2)],
[-1/2, -(3/4)**(1/2), 0.],
[0., -(1/3)**(1/2), (2/3)**(1/2)],
[1/2, (1/12)**(1/2), (2/3)**(1/2)]])
avector = [a1, a2]
bvector = [b1, b2]
cvector = [np.zeros([6, 3])]*2
for i in range(2):
for j in range(6):
cvector[i][j] = np.cross(avector[i][j], bvector[i][j])
print(i, j, cvector[i][j])
print(cvector)
输出为:
0 0 [ 0. -0.57735027 0.81649658]
0 1 [-0.5 -0.28867513 -0.81649658]
0 2 [-0.5 -0.8660254 0. ]
0 3 [ 0.5 -0.28867513 -0.81649658]
0 4 [-0.5 0.8660254 0. ]
0 5 [ 1. 0. 0.]
1 0 [-0.5 -0.28867513 -0.81649658]
1 1 [ 0. 0.57735027 -0.81649658]
1 2 [-0.5 -0.8660254 0. ]
1 3 [-0.5 0.28867513 0.81649658]
1 4 [ 1. 0. -0.]
1 5 [-0.5 0.8660254 0. ]
[array([[-0.5 , -0.28867513, -0.81649658],
[ 0. , 0.57735027, -0.81649658],
[-0.5 , -0.8660254 , 0. ],
[-0.5 , 0.28867513, 0.81649658],
[ 1. , 0. , -0. ],
[-0.5 , 0.8660254 , 0. ]]),
array([[-0.5 , -0.28867513, -0.81649658],
[ 0. , 0.57735027, -0.81649658],
[-0.5 , -0.8660254 , 0. ],
[-0.5 , 0.28867513, 0.81649658],
[ 1. , 0. , -0. ],
[-0.5 , 0.8660254 , 0. ]])]
可以注意到在for
循环内计算的第一行0 0
与矩阵cvector[0][0]
不匹配。我希望他们匹配。第六行0 5
和矩阵cvector[0][0]
也是如此
如果在第一个for
循环中将range(2)
更改为range(1)
,您将不会看到相同的行为,而且在我看来,是正确的行为
有人知道为什么会这样吗
使用
[np.zeros([6, 3])]*2
创建cvector
时,不是在创建2np.array
。第二个实例只是第一个实例的视图。所以,cvector[0] = cvector[1]
。因此,在循环中,当您为i=1
再次执行i=0
计算时,将覆盖该计算相反,您可以创建两个独立的数组,如下所示:
它的工作原理与预期一致:
考虑以下示例来说明第一个数组被覆盖的原因:
注意在这两种情况下第一个元素是如何被覆盖的
相关问题 更多 >
编程相关推荐