numpy заменить значение отрицательным int - PullRequest
2 голосов
/ 19 июня 2020

Я делаю игру ti c ta c toe в качестве упражнения. Я пытаюсь заменить X на 3, O на -3 и - на 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]

Однако каждый раз, когда программа пытается заменить O на -3, мой массив выглядит следующим образом

[['3' '-' 'X']
 ['-' 'X' 'O']
 ['-' '-' 'X']]

Такое бывает даже если я пытаюсь заменить на -9. Кроме того, когда я пытаюсь заменить '_' на -3, он отображается как '-' в массиве

Если я делаю игровое поле как обычный список, заменяю все и возвращаю его как np.array, все работает. Почему это происходит? Спасибо!

Ответы [ 4 ]

2 голосов
/ 19 июня 2020

Я могу ответить, почему это происходит. Ваше игровое поле представляет собой массив U1 (что бы это ни было), поэтому -3 приводится к типу <U1, если вы определяете

playfield = np.array([
   ['X', 'O', 'X'],
   ['-', 'X', 'O'],
   ['-', '-', 'X']
], dtype=object) 

, а также

codes = {"X": "3", "O": "-3", "-": "0"}

Все работает (вам придется преобразовать массив обратно в целые числа в конце вашей замены.) Немного ужасно, но не слишком удивительно, поскольку numpy (как следует из названия) предназначен для массивов чисел.

1 голос
/ 19 июня 2020

Я бы просто создал новый массив с правильным dtype раньше:

p2 = empty_like(playfield, dtype=int)
for k, v in codes.items():
    p2[playfield==k] = v
playfield = p2
1 голос
/ 19 июня 2020

Это то, что вам понадобится:

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]]

Пояснение : Ваш массив playfield представляет собой массив из одного символа . Чтобы включить двухсимвольный "-3", сначала преобразуйте playfield в двухсимвольный массив 'U2' (имейте в виду, что если вы решите использовать больше, чем одно число di git, вам необходимо расширить свой строковый массив до максимума символов в наибольшем числе 'Un'), а затем замените их строковой версией чисел и, наконец, преобразуйте их в числа в последней строке.

1 голос
/ 19 июня 2020

playfield - это массив символов, поэтому любое отрицательное число становится '-'. Если вы измените 'O' на положительное целое число, все должно работать нормально.

Например, если вы используете:

codes = {'X': 3, 'O': 2, '-': 0}

Тогда результат будет:

array([['3', '2', '3'],
       ['0', '3', '2'],
       ['0', '0', '3']], dtype='<U1')

Однако итерация по всему массиву, возможно, является худшим способом подстановки в numpy.

Что-то вроде этого было бы более эффективным:

for k in codes.keys():
    playfield[playfield == k] = codes[k]

Если вам нужен окончательный массив чтобы быть массивом int s, я бы сказал go о преобразованиях следующим образом:

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

Таким образом, вы все равно можете начать с исходного массива символов, и вам нужно будет только выполнить преобразование типа один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...