сложная специальная numpy операция - PullRequest
1 голос
/ 21 февраля 2020

У меня есть массив NumPy, заполненный индексами чисел input. Я хочу проверить, есть ли в нем определенные индексы indices. Скажем, в i-й строке input, input[i] есть записи j_1<...<j_n, что их значения принадлежат indices. Я хотел бы переключить значение input[i,j_n] со случайным значением из indices. Как я могу сделать это элегантно и эффективно?

Пример:

input = [[1,2,3], [4,5,6], [7,8,9]]

индексы = [2,4,6]

вход -> [[1,4,3], [4,5,4], [7,8,9]]

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Примерно так:

import random

input = [[i if i not in indices else random.choice(indices) for i in x] for x in input]

Лучше, конечно, проверить set вместо list:

import random

d = {*indices}
input = [[i if i not in d else random.choice(indices) for i in x] for x in input]
0 голосов
/ 22 февраля 2020

Если я правильно понимаю, вы хотите что-то вроде этого:

input = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9]])

indices = [2, 4, 6]

mask = np.isin(input, indices)
# array([[False,  True, False],
#        [ True, False,  True],
#        [False, False, False]])

input[mask] = np.random.choice(indices, np.count_nonzero(mask))
# array([[1, 6, 3],
#        [6, 5, 4],
#        [7, 8, 9]])
...