Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy将值替换为负整数_Python_Arrays_Numpy - Fatal编程技术网

Python numpy将值替换为负整数

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]

我正在做一个抽签游戏作为练习。我试图用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]
然而,每当程序试图用-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