我正在写一个简短的脚本,以确定从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]])