为什么我的python列表元素(子数组)在与另一个交换时被覆盖



我正在写一个简短的脚本,以确定从3x7矩阵中随机选择的元素移动到"中心"(1,3(位置所需的平均排列数,如下所示:

import numpy as np
import random as rand
cards = np.arange(1,22)
choice = rand.choice(cards)
print choice
block = np.split(cards, 3)
print block
count = 0
while block[1][3] != choice:
i,j = np.where(block==choice)
print np.where(block==choice)
block[i[0]], block[1] = block[1], block[i[0]]
print block
cards = np.concatenate((block[0],block[1],block[2]))
print cards
block = np.transpose(np.split(cards, 7))
print block
count += 1
print count

不幸的是,在2-3个循环后,当包含所选数字的子阵列在交换过程中被删除并替换为中心/第二个时,我遇到了一个障碍(第18行(。例如:

tcb-MacBook:3x7cards TCB$ python 3x7.py 
1
[array([1, 2, 3, 4, 5, 6, 7]), array([ 8,  9, 10, 11, 12, 13, 14]), array([15, 16, 17, 18, 19, 20, 21])]
(array([0]), array([0]))
[array([ 8,  9, 10, 11, 12, 13, 14]), array([1, 2, 3, 4, 5, 6, 7]), array([15, 16, 17, 18, 19, 20, 21])]
[ 8  9 10 11 12 13 14  1  2  3  4  5  6  7 15 16 17 18 19 20 21]
[[ 8 11 14  3  6 16 19]
[ 9 12  1  4  7 17 20]
[10 13  2  5 15 18 21]]
1
(array([1]), array([2]))
[[ 8 11 14  3  6 16 19]
[ 9 12  1  4  7 17 20]
[10 13  2  5 15 18 21]]
[ 8 11 14  3  6 16 19  9 12  1  4  7 17 20 10 13  2  5 15 18 21]
[[ 8  3 19  1 17 13 15]
[11  6  9  4 20  2 18]
[14 16 12  7 10  5 21]]
2
(array([0]), array([3]))
[[11  6  9  4 20  2 18]
[11  6  9  4 20  2 18]
[14 16 12  7 10  5 21]]
[11  6  9  4 20  2 18 11  6  9  4 20  2 18 14 16 12  7 10  5 21]
[[11  4 18  9  2 16 10]
[ 6 20 11  4 18 12  5]
[ 9  2  6 20 14  7 21]]
3
(array([], dtype=int64), array([], dtype=int64))
Traceback (most recent call last):
File "3x7.py", line 22, in <module>
block[i[0]], block[1] = block[1], block[i[0]]
IndexError: index 0 is out of bounds for axis 0 with size 0

我知道发生了什么,在哪里,但不知道为什么。有什么想法吗?

这说明了使用block表达式切换数组行的危险:

In [82]: arr = np.arange(10).reshape(5,2)                                                                            
In [83]: arr                                                                                                         
Out[83]: 
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])
In [84]: arr[1],arr[2] = arr[2],arr[1]                                                                               
In [85]: arr                                                                                                         
Out[85]: 
array([[0, 1],
[4, 5],
[4, 5],
[6, 7],
[8, 9]])

该方法适用于列表列表:

In [86]: alist = np.arange(10).reshape(5,2).tolist()                                                                 
In [87]: alist[1],alist[2] = alist[2],alist[1]                                                                       
In [88]: alist                                                                                                       
Out[88]: [[0, 1], [4, 5], [2, 3], [6, 7], [8, 9]]

行切换的正确方法是:

In [89]: arr = np.arange(10).reshape(5,2)                                                                            
In [90]: arr[[1,2]] = arr[[2,1]]                                                                                     
In [91]: arr                                                                                                         
Out[91]: 
array([[0, 1],
[4, 5],
[2, 3],
[6, 7],
[8, 9]])

最新更新