在double`for`循环中错误地索引

2024-10-04 03:17:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在下面发布了一个复制我的问题的简化代码版本:

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),您将不会看到相同的行为,而且在我看来,是正确的行为

有人知道为什么会这样吗


Tags: 代码ina2fora1nprange矩阵
1条回答
网友
1楼 · 发布于 2024-10-04 03:17:59

使用[np.zeros([6, 3])]*2创建cvector时,不是在创建2np.array。第二个实例只是第一个实例的视图。所以,cvector[0] = cvector[1]。因此,在循环中,当您为i=1再次执行i=0计算时,将覆盖该计算

相反,您可以创建两个独立的数组,如下所示:

cvector = [np.zeros([6, 3]), np.zeros([6, 3])]

它的工作原理与预期一致:

(0, 0, array([ 0.        , -0.57735027,  0.81649658]))
(0, 1, array([-0.5       , -0.28867513, -0.81649658]))
(0, 2, array([-0.5      , -0.8660254,  0.       ]))
(0, 3, array([ 0.5       , -0.28867513, -0.81649658]))
(0, 4, array([-0.5      ,  0.8660254,  0.       ]))
(0, 5, array([1., 0., 0.]))
(1, 0, array([-0.5       , -0.28867513, -0.81649658]))
(1, 1, array([ 0.        ,  0.57735027, -0.81649658]))
(1, 2, array([-0.5      , -0.8660254,  0.       ]))
(1, 3, array([-0.5       ,  0.28867513,  0.81649658]))
(1, 4, array([ 1.,  0., -0.]))
(1, 5, array([-0.5      ,  0.8660254,  0.       ]))

[array([[ 0.        , -0.57735027,  0.81649658],
       [-0.5       , -0.28867513, -0.81649658],
       [-0.5       , -0.8660254 ,  0.        ],
       [ 0.5       , -0.28867513, -0.81649658],
       [-0.5       ,  0.8660254 ,  0.        ],
       [ 1.        ,  0.        ,  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.        ]])]

考虑以下示例来说明第一个数组被覆盖的原因:

In [1]: import numpy as np

In [2]: cvector = [np.zeros([6, 3])]*2

In [3]: cvector
Out[3]: 
[array([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]), 
 array([[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])]

In [4]: cvector[0][0] = (1, 2, 3)

In [5]: cvector
Out[5]: 
[array([[1., 2., 3.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]), 
 array([[1., 2., 3.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]])]

注意在这两种情况下第一个元素是如何被覆盖的

相关问题 更多 >