Случайный индекс ненулевого значения в массиве NumPy - PullRequest
0 голосов
/ 02 декабря 2018

Надеюсь, об этом раньше не спрашивали.Не уверен, как я могу переформулировать вопрос.Эта запись очень похожа, но все еще не совсем то, что я ищу.

У меня есть массив с переменной длиной (что-то между 4-12).Значения массива - либо 0, либо 1. Я бы хотел получить индекс случайной выборки из массива, который не равен 0.

Моя идея заключалась в том, чтобы сделать что-то вроде этого:

def sample(self):
        flag = 0
        while flag == 0:
            sampleValue = randint(0, len(myArray())-1)
            flag = myArray()[sampleValue]
        return sampleValue

Но это не очень хороший код, и в конечном итоге он попадет в бесконечный цикл while.Конечно, я мог бы улучшить это.Скорее всего, в python есть гораздо более красивый способ сделать это:)

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Сначала вы можете сгенерировать список индексов с помощью:

my_idcs = np.where(my_array)[0]

, затем вы можете случайным образом получить один из индексов, например, с помощью random.choice:

from random import choice

my_idx = choice(np.where(my_array)[0])

это, таким образом, вернет единственный индекс, где соответствующее значение my_array[my_idx] равно 1.

Обратите внимание, что если в my_array нет 1 s, то это повысит IndexError.

0 голосов
/ 02 декабря 2018

Вы можете получить индексы, где массив a отличен от нуля с numpy.nonzero

>>> a = np.array([1, 0, 1, 0, 1, 1, 1, 0, 0])
>>> idx_nonzero, = np.nonzero(a)
>>> 
>>> idx_nonzero
array([0, 2, 4, 5, 6])

, а затем выбрать одно из этих значений с помощью numpy.random.choice.

>>> np.random.choice(idx_nonzero)
5
...