Случайные допустимые элементы данных в массиве numpy - PullRequest
0 голосов
/ 29 марта 2019

Предположим, у меня есть массив 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 эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Пример

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])
0 голосов
/ 29 марта 2019

Найти ненулевые значения по:


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...