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]
Другие вопросы по тегам