Numpy выбирает элементы из 2 массивов
Мне нужно выбрать n элементов из 2-х массивов, чтобы индексы были одинаковыми. Так, например, мне нужно выбрать два элемента из x случайным образом и выбрать элементы из y так, чтобы выбранные индексы y совпадали с индексами x:
x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])
x_chosen = np.random.choice(x,(2,))
Сказать x_chosen
Заворачивает быть: x_chosen = [0.1123,0.223]...
тогда мне понадобится:
y_chosen = [1,1]
В настоящее время у меня есть обходной путь... но я хотел бы использовать базовую функцию numpy или scipy, а не свою собственную функцию, которая в основном состоит всего из 3 строк, чтобы сохранить мои функции в этом проекте в области видимости... и я бы предпочел не иметь этого создание одноразовых переменных по всему основному коду:
x_index = np.asarray([i for i in range(len(x))])
x_chosen_indices = np.random.choice(x_index,(2,))
x_chosen = x[x_chosen_indices]
y_chosen = y[x_chosen_indices]
Кроме того, я мог бы складывать, выбирать и разбивать... но я думаю, что это все еще оставляет мне одноразовую функцию, которую я должен где-то придерживаться... или 4-5 строк кода, которые не имеют смысла...
4 ответа
Использование np.random.randint()
найти ваши показатели:
x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])
indices = np.random.randint(0, x.size, 2)
>>> x[indices]
array([ 0.1123, 0.223 ])
>>> y[indices]
array([1, 1])
РЕДАКТИРОВАТЬ
Как уже упоминалось в комментарии Б. М. использовать np.random.choice(.., replace=False)
чтобы не использовать один и тот же индекс несколько раз:
indices = np.random.choice(x.size, 2, replace=False)
Как насчет первого выбора индексов:
import numpy as np
choice = np.random.choice(np.array(range(len(x))), 2)
и затем выбирая в соответствии с ними:
x_chosen, y_chosen = x[choice], y[choice]
Вот два метода, которые, я думаю, могут сработать. Первый тип такой же, как ваш метод выше, но он избавляется от одной строки:
index = np.random.choice(np.arange(len(x)), 2, replace=False)
x_chosen = x[index]
y_chosen = y[index]
In [15]: x_chosen
Out[15]: array([ 0.8873, 0.223 ])
Я не уверен, что это то, что вы хотите, но это одна строка, которая даст вам кортежи (x, y):
import random
random.sample(zip(x, y), 2)
Out[22]: [(0.223, 1), (0.1123, 1)]
Ты можешь использовать numpy.random.permutation
создать перемешанный массив индексов. Затем вы можете выбрать столько случайно выбранных общих элементов, сколько захотите:
import numpy as np
x = np.asarray([0.1123,0.223,0.8873])
y = np.asarray([1,1,2])
indices= np.random.permutation(np.size(x, 0))
x_chosen = x[indices[:2]]
y_chosen = y[indices[:2]]
print(x_chosen)
>>>[ 0.8873 0.1123]
print(y_chosen)
>>>[2 1]