NumPy Сравнение данных массива - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть два 3D Numpy массива

win_combination = np.array([
[[0, 0], [0, 1], [0, 2]],
[[1, 0], [1, 1], [1, 2]],
[[2, 0], [2, 1], [2, 2]],
[[0, 0], [1, 0], [2, 0]],
[[0, 1], [1, 1], [2, 1]],
[[0, 2], [1, 2], [2, 2]],
[[0, 0], [1, 1], [2, 2]],
[[0, 2], [1, 1], [2, 0]]
])

и

game_log = np.array([[1 1],[0 2],[1 0]])

Я бы хотел сравнить, совпадают ли данные game_log с любым из массивов в win_combination, если они совпадают он может печатать True, иначе печатать False.

По сути, я хочу, чтобы, если game_log == [[0, 0], [0, 1], [0, 2]], он мог печатать True, если это не так тогда мой код должен сравнить другой массив и в этом случае он должен напечатать False

Я пытался,

for comb in win_combination:
    if game_log == comb:
        print(True)
    else:
        print(False)

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Два массива равны, если np.all(x == y) (или альтернативно (x == y).all()). У вас есть 3D-массив формы (N, A, B) и 2D-массив формы (A, B). В этом случае N=8, A=3 и B=2. Эти формы передаются в форме трехмерного массива. Если вы примените np.all к последним двум измерениям, вы можете получить значения N True или False для каждой из комбинаций. np.any сообщит вам, если какое-либо из них True.

all имеет ключевое слово axis. Начиная с numpy 1.7.0, axis может указывать более одной оси одновременно, поэтому вы можете сделать:

matches = np.all(win_combination == game_log, axis=(-1, -2))

Для более старых версий numpy вам потребуется изменить форму, чтобы получить по одной оси или дважды all:

matches = np.all((win_combination == game_log).reshape(win_comination.shape[0], -1), axis=-1)

ИЛИ

matches = np.all(np.all(win_combination == game_log, axis=-1), axis=-1)

Окончательный результат - matches.any() или np.any(matches). Вы можете написать это как однострочник:

np.all(win_combination == game_log, axis=(-1, -2)).any()
0 голосов
/ 07 апреля 2020

Попробуйте этот метод:

   def in_array(game_log, array):
        for comb in array:
            for arr in comb:
                if game_log.all() == arr.all():
                    return True
        return False

Передайте game_log первому аргументу, а 3D - следующему, исходя из того, что, как я понимаю, должно вывести True если комбинация находится в массиве, а False в противном случае.

Имейте в виду, что значение истинности массива с более чем одним элементом является неоднозначным. Поэтому лучше использовать all () , если оба массива точно совпадают, и any () , если какой-либо элемент в одном массиве существует в другом.

0 голосов
/ 07 апреля 2020

IIU C:

ans = np.any(np.all(game_log == win_combination, axis=(1,2)))
print(ans)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...