Python numpy将值替换为负整数
我正在做一个抽签游戏作为练习。我试图用3代替X,用-3代替O,用0代替-Python numpy将值替换为负整数,python,arrays,numpy,Python,Arrays,Numpy,我正在做一个抽签游戏作为练习。我试图用3代替X,用-3代替O,用0代替- import numpy as np playfield = np.array([ ['X', 'O', 'X'], ['-', 'X', 'O'], ['-', '-', 'X'] ]) codes = {'X': 3, 'O': -3, '-': 0} for idx, x in np.ndenumerate(playfield): playfield[idx] = codes[x]
import numpy as np
playfield = np.array([
['X', 'O', 'X'],
['-', 'X', 'O'],
['-', '-', 'X']
])
codes = {'X': 3, 'O': -3, '-': 0}
for idx, x in np.ndenumerate(playfield):
playfield[idx] = codes[x]
然而,每当程序试图用-3替换O时,我的数组是这样的
[['3' '-' 'X']
['-' 'X' 'O']
['-' '-' 'X']]
即使我尝试用-9替换它,它也会发生。另外,当我尝试用-3替换'307;'时,它在数组中显示为'-'
如果我把playfield作为一个普通的列表,替换所有内容,并将其作为np.array返回,那么所有内容都可以工作。为什么会这样?谢谢大家! 我可以回答为什么会这样。你的游戏场是一个U1数组(不管它是什么),因此-3被转换到
游戏场是一个字符数组,所以任何负数都变成'-'
。如果将'O'
更改为正整数,它应该可以正常工作
例如,如果您使用:
codes = {'X': 3, 'O': 2, '-': 0}
结果是:
array([['3', '2', '3'],
['0', '3', '2'],
['0', '0', '3']], dtype='<U1')
如果您希望最后一个数组是int
s的数组,我将进行如下转换:
import numpy as np
playfield = np.array([
['X', 'O', 'X'],
['-', 'X', 'O'],
['-', '-', 'X']
])
codes = {'X': 6, 'O': 3, '-': 0}
for k in codes:
playfield[playfield == k] = codes[k]
playfield = playfield.astype(int) - 3
这样,您仍然可以从原始字符数组开始,只需进行一次类型转换。这是您需要的:
playfield = playfield.astype('U2')
for k, v in codes.items(): playfield[playfield==k] = str(v)
playfield = playfield.astype(np.int)
输出:
[[ 3 -3 3]
[ 0 3 -3]
[ 0 0 3]]
解释:您的游戏场
数组是单个字符的数组。要包含两个字符的“-3”
,首先将游戏场
转换为两个字符的数组'U2'
(请注意,如果选择使用大于一位数的数字,则需要将字符串数组扩展到最大数字中的最大字符数'Un'
)然后替换为字符串版本的数字,最后将它们转换为最后一行的数字。我只需使用正确的数据类型创建一个新数组,然后:
p2 = empty_like(playfield, dtype=int)
for k, v in codes.items():
p2[playfield==k] = v
playfield = p2
是否有理由创建一个完整的新数组,而不是在之后强制转换类型?还将使用新类型创建数组的副本,因此它也是一个新数组。使用我的方法,我可以避免在最后执行减法以返回负值,因为它从一开始就具有正确的数据类型。我不需要任何“神奇”的数字。
playfield = playfield.astype('U2')
for k, v in codes.items(): playfield[playfield==k] = str(v)
playfield = playfield.astype(np.int)
[[ 3 -3 3]
[ 0 3 -3]
[ 0 0 3]]
p2 = empty_like(playfield, dtype=int)
for k, v in codes.items():
p2[playfield==k] = v
playfield = p2