Как случайным образом выбрать индекс из одинаковых элементов

#python #numpy

Вопрос:

В numpy у меня есть два массива a , и b где все записи равны 1 или 0, я это делаю c = a != b , теперь я хочу случайным образом выбрать индекс из c этого true (имеется в виду индекс, где a и b где), как мне это сделать?

Комментарии:

1. Как выглядит ваш ожидаемый результат

Ответ №1:

Вы можете сочетать np.random.choice() с np.where() .

Входные:

 >>> import numpy as np
>>> a = np.array([0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1])
>>> b = np.array([1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1])
>>> c =  a != b
>>> c
array([ True, False,  True, False, False,  True,  True,  True, False,
       False,  True, False])
 

Пример:

 >>> np.random.choice(np.where(c)[0], size=1).item()
7
 

Разбивка: сначала возьмем индексы c , где True :

 >>> np.where(c)[0]
array([ 0,  2,  5,  6,  7, 10])
 

Теперь выбери одну:

 >>> np.random.choice(np.where(c)[0], size=1)
7
 

И, наконец, получите 0-е значение в виде скаляра с .item() помощью .

Комментарии:

1. о, черт возьми, я знал np.where , что должен был где-то использовать, ха-ха-ха

Ответ №2:

Быстрый и грязный способ добиться этого:

 import numpy as np

a = np.array([1,0,1,1,1,0,0,0,1])
b = np.array([0,1,1,1,0,0,1,0,1])
c = a != b
# Generating a list of indexes where your desired criteria is met
d = np.where(c)[0]
r = np.random.choice(d)
 

Комментарии:

1. Цикл for for i in range(len(c)):... — это в основном более медленная версия d, = np.where(c)

2. Да, вы правы, просто забыли о существовании numpy.where