我正在尝试编写代码来生成一副牌。这副牌是一个二维数组,其中包含每张牌。每张牌的数组包含其牌值以及花色,用 0 到 3 的值表示。然而,代码输出如下:
[[ 1. 1.]
...
[13. 1.]
[ 1. 1.]
...
[13. 1.]
[ 1. 2.]
...
[13. 2.]
[ 1. 3.]
...
[13. 3.]]
前 13 个索引是我的问题,因为我编写的代码我认为应该输出[1. 0.]
到[13. 0.]
我的代码设计为每种花色有 13 张牌,从 1 到 13(含)。每张牌的索引 0 代表牌值,从 A 到 K。索引 1 代表其花色(0=S,1=H,2=C,3=D)。
suits = 4
suitsize = np.empty(shape=(13,2))
suitsize[:,0] = np.arange(1,suitsize.shape[0]+1)
a = suitsize
print(suitsize)
for i in range(1,suits):
a[:,1] = i
suitsize = np.concatenate([suitsize,a])
print(suitsize)
无论我使用 np.empty 还是 np.zeros,前 13 个索引仍然将其索引 1 值(花色)替换为 1。这意味着我最终制作了一副有 0 张黑桃、26 张红桃、13 张梅花和 13 张方块的纸牌。
如果有人能解释一下这里发生了什么,或者有什么解决办法,请告诉我。谢谢!
你遇到了一个典型的 NumPy 问题——可变数组。问题在于,当你写入 时
a = suitsize
,你并没有创建该数组的新副本。你只是在计算机内存中对同一个数组建立了一个新的引用。所以,当你执行 时a[:,1] = i
,你同时也在修改它suitsize
。您需要创建数组的实际副本,而不仅仅是引用。只需将此行更改
a = suitsize
为a = suitsize.copy()
。