Случайные допустимые элементы данных в массиве numpy

#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