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

问题描述 投票:1回答:1

我正在编写一个简短的脚本,以确定从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个周期后遇到了一个路障,其中包含所选编号的子数组被删除,并在交换过程中被替换为中心/ 2号(第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

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

python arrays list numpy swap
1个回答
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]])
© www.soinside.com 2019 - 2024. All rights reserved.