#numpy
#numpy
Вопрос:
Предположим, у меня есть массив numpy следующим образом:
data = np.array([[1, 3, 8, np.nan], [np.nan, 6, 7, 9], [np.nan, 0, 1, 2], [5, np.nan, np.nan, 2]])
Я хотел бы случайным образом выбрать n допустимых элементов из массива, включая их индексы.
Предоставляет ли numpy эффективный способ сделать это?
Ответ №1:
Пример
data = np.array([[1, 3, 8, np.nan], [np.nan, 6, 7, 9], [np.nan, 0, 1, 2], [5, np.nan, np.nan, 2]])
n = 5
Получаем допустимые индексы
y_val, x_val = np.where(~np.isnan(data))
n_val = y_val.size
Выберите случайное подмножество размера n
по индексу
pick = np.random.choice(n_val, n)
Применить индекс к допустимым координатам
y_pick, x_pick = y_val[pick], x_val[pick]
Получить соответствующие данные
data_pick = data[y_pick, x_pick]
Полюбуйтесь
data_pick
# array([2., 8., 1., 1., 2.])
y_pick
# array([3, 0, 0, 2, 3])
x_pick
# array([3, 2, 0, 2, 3])
Ответ №2:
Найдите ненулевые значения с помощью :
In [37]: a = np.array(np.nonzero(data)).reshape(-1,2)
In [38]: a
Out[38]:
array([[0, 0],
[0, 0],
[1, 1],
[1, 1],
[2, 2],
[2, 3],
[3, 3],
[3, 0],
[1, 2],
[3, 0],
[1, 2],
[3, 0],
[2, 3],
[0, 1],
[2, 3]])
Теперь выберите случайный выбор :
In [44]: idx = np.random.choice(np.arange(len(a)))
In [45]: data[a[idx][0],a[idx][1]]
Out[45]: 2.0