我试图通过重新创建2048来教自己一些基本的编码,但我已经碰壁了。
我要做的是:
1)创建一个表示板上空间的矩阵,空值为零值
2)根据玩家想要移动棋子的轴移动矩阵的轴
3)使用np.tolist()
从矩阵中的每一行创建一个列表4)使用listID.sort(key = bool)按照其真值对列表进行排序,将零置于列表的一端而不重新排列具有值的项目,并通过修改以下列表来节省空间:地方
5)合并列表中值相等的相邻项
6)使用np.columnstack将排序后的列表组合成一个矩阵,过去编写前一个矩阵
7)将轴移位到原来的位置
我被绊倒的地方是步骤4)。
列表根本没有排序,没有任何变化。
例如a0(第一行的列表)将是[0,2,0,0],但在排序之后,它仍然是[0,2,0,0]。
这是我可怕的,nooby,WIP代码,如果您愿意,可以查看和寻找自己:
import numpy as np
a = np.matrix([[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]])
print (a)
b = np.random.randint(low=0, high=3)
c = b
while c == b:
c = np.random.randint(low=0, high=3)
d = np.random.randint(low=0, high=3)
e = d
while e == d:
e = np.random.randint(low=0, high=3)
a.itemset((b, c), 2)
a.itemset((d, e), 2)
print (a)
score = np.sum(a)
print (score)
#while 0 in a:
#direction = input("U, D, L, R?")
#if direction == "U":
# mode = 1
#if direction == "D":
# mode = 2
#if direction == "L":
# mode = 3
#if direction == "R":
# mode = 4
#transpose axes according to mode
#sort each array in matrix by boolean value
#refuses to sort?
a0 = a[0].tolist()
a0.sort(key=bool)
a1 = a[1].tolist()
a1.sort(key=bool)
a2 = a[2].tolist()
a2.sort(key=bool)
a3 = a[3].tolist()
a3.sort(key=bool)
#reverse each list depending on mode
#combine back into matrix
print (a0, a1, a2, a3)
a = np.column_stack([[a0], [a1], [a2], [a3]])
print (a)
我进行了搜索和搜索,但我所看到的并没有提供一些有关我如何做错的见解,我认为我是。
编辑:已解决!
import numpy as np
import numpy.matlib
import itertools
a = np.matlib.zeros((4,4))
print (a)
b = np.random.randint(low=0, high=3)
c = b
while c == b:
c = np.random.randint(low=0, high=3)
d = np.random.randint(low=0, high=3)
e = d
while e == d:
e = np.random.randint(low=0, high=3)
a.itemset((b, c), float(2))
a.itemset((d, e), float(2))
print (a)
score = np.sum(a)
print (score)
#while 1 in a:
#direction = input("U, D, L, R?")
#if direction == "U":
# mode = 1
#if direction == "D":
# mode = 2
#if direction == "L":
# mode = 3
#if direction == "R":
# mode = 4
#transpose axes according to mode
#sort each array in matrix by boolean value
#refuses to sort?
a0 = a[0].tolist()
a01 = []
a0_2 = list(itertools.chain.from_iterable(a0))
for item in a0_2:
a01.append(float(item))
a01.sort(key=bool)
a1 = a[1].tolist()
a11 = []
a1_2 = list(itertools.chain.from_iterable(a1))
for item in a1_2:
a11.append(float(item))
a11.sort(key=bool)
a2 = a[2].tolist()
a21 = []
a2_2 = list(itertools.chain.from_iterable(a2))
for item in a2_2:
a21.append(float(item))
a21.sort(key=bool)
a3 = a[3].tolist()
a31 = []
a3_2 = list(itertools.chain.from_iterable(a3))
for item in a3_2:
a31.append(float(item))
a31.sort(key=bool)
#reverse each list depending on mode
#combine back into matrix
print (a01, a11, a21, a31)
a = np.vstack([[a01], [a11], [a21], [a31]])
print (a)
答案 0 :(得分:1)
你说你正在试图“按真值排序”,而且NumPy没有这个选项。嗯,确实如此!
a0 = a0[(~a0.astype(bool)).argsort(kind='mergesort')]
这需要a0并将其转换为True,无论它是非零,然后将其反转(对非零而言为False),然后对其进行排序(使用mergesort进行稳定排序)。 argsort()
的使用让我们可以进行“间接”排序,即将一件事分类。
相比之下,通过将数组转换为列表然后再返回来完成它的方式相当低效。但是如果数据很小,你就不会注意到这一点,就像你的情况一样。