Как получить оставшиеся индексы после выбора случайного набора индексов в Python?

#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])