#python #numpy #random #numpy-ndarray
#python #numpy #Случайный #numpy-ndarray
Вопрос:
Используйте следующий код, чтобы проиллюстрировать мой вопрос.
import numpy as np
np.random.seed(200)
a = np.array([1,21,6,41,8]) # given an array with 5 elements
idx = np.random.choice(5, 3, replace=False) # randomly select 3 indexes between 0 and 4
idx.sort() # sort indexes
print(idx) # [0 3 4]
print(a[idx]) # get random selected subset using the indexes, [ 1 41 8]
Как получить оставшиеся индексы [1,2]?
Комментарии:
1. вы можете создать новый список
remaining = [x for x in range(5) if x not in idx]
или просто выбрать случайные индексы из списка со всеми индексами
Ответ №1:
In [123]: np.random.seed(200)
...: a = np.array([1,21,6,41,8]) # given an array with 5 elements
...: idx = np.random.choice(5, 3, replace=False) # randomly select 3 indexe
...: s between 0 and 4
...: idx.sort() # sort indexes
In [124]: idx
Out[124]: array([0, 3, 4])
In [125]: a[idx]
Out[125]: array([ 1, 41, 8])
Мы могли бы создать логическое mask
значение и найти истинные индексы:
In [126]: mask = np.ones(a.shape, bool)
In [127]: mask[idx]=False
In [128]: mask
Out[128]: array([False, True, True, False, False])
In [129]: np.nonzero(mask)[0]
Out[129]: array([1, 2])
In [131]: np.arange(a.shape[0])[mask]
Out[131]: array([1, 2])
np.delete
выполняет ли этот вид маскировки:
In [132]: np.delete(np.arange(a.shape[0]), idx)
Out[132]: array([1, 2])
Ответ №2:
Один из способов сделать это:
inverted_idx = [x not in idx for x in range(0, len(a))]
print(a[inverted_idx])
Результат:
[21 6]
Это создает логическую маску, если вы предпочитаете целочисленную маску, подобную той, которая у вас была:
inverted_idx = [x for x in range(0, len(a)) if x not in idx]
print(a[inverted_idx])