Подтвердить что ты не робот

Numpy: получить случайный набор строк из 2D-массива

У меня есть очень большой 2D-массив, который выглядит примерно так:

a=
[[a1, b1, c1],
 [a2, b2, c2],
 ...,
 [an, bn, cn]]

Используя numpy, существует ли простой способ получить новый 2D-массив, например, с 2 случайными строками из исходного массива a (без замены)?

например

b=
[[a4,  b4,  c4],
 [a99, b99, c99]]
4b9b3361

Ответ 1

>>> A = np.random.randint(5, size=(10,3))
>>> A
array([[1, 3, 0],
       [3, 2, 0],
       [0, 2, 1],
       [1, 1, 4],
       [3, 2, 2],
       [0, 1, 0],
       [1, 3, 1],
       [0, 4, 1],
       [2, 4, 2],
       [3, 3, 1]])
>>> idx = np.random.randint(10, size=2)
>>> idx
array([7, 6])
>>> A[idx,:]
array([[0, 4, 1],
       [1, 3, 1]])

Объединяя это для общего случая:

A[np.random.randint(A.shape[0], size=2), :]

Для замены (numpy 1.7.0 +):

A[np.random.choice(A.shape[0], 2, replace=False), :]

Я не верю, что есть хороший способ генерировать случайный список без замены до 1.7. Возможно, вы можете настроить небольшое определение, которое гарантирует, что два значения не совпадают.

Ответ 2

Это старый пост, но это то, что работает лучше всего для меня:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)]

измените replace = False на True, чтобы получить то же самое, но с заменой.

Ответ 3

Другой вариант - создать случайную маску, если вы просто хотите понизить выборку своих данных на определенный коэффициент. Скажем, я хочу сбрасывать образец до 25% от моего исходного набора данных, который в настоящее время хранится в массиве data_arr:

# generate random boolean mask the length of data
# use p 0.75 for False and 0.25 for True
mask = numpy.random.choice([False, True], len(data_arr), p=[0.75, 0.25])

Теперь вы можете вызывать data_arr[mask] и возвращать ~ 25% строк, произвольно отбираемых.

Ответ 4

Если вам нужны одни и те же строки, но только случайный образец, то

import random
new_array = random.sample(old_array,x)

Здесь x, должен быть "int", определяющим количество строк, которые вы хотите случайно выбрать.

Ответ 5

Это ответ, аналогичный предоставленному Хези Рашеффом, но упрощенный, чтобы новые пользователи Python понимали, что происходит (я заметил, что многие новые студенты, изучающие данные, выбирают случайные выборки самым странным образом, потому что они не знают, что делают в Python).

Вы можете получить несколько случайных индексов из вашего массива, используя:

indices = np.random.choice(A.shape[0], amount_of_samples, replace=False)

Затем вы можете использовать нарезку с вашим массивом numpy, чтобы получить образцы по этим индексам:

A[indices]

Это даст вам указанное количество случайных выборок из ваших данных.

Ответ 6

Я вижу, что перестановка была предложена. Фактически это можно сделать одной строкой:

>>> A = np.random.randint(5, size=(10,3))
>>> np.random.permutation(A)[:2]

array([[0, 3, 0],
       [3, 1, 2]])

Ответ 7

Если вы хотите создать несколько случайных подмножеств строк, например, если вы выполняете RANSAC.

num_pop = 10
num_samples = 2
pop_in_sample = 3
rows_to_sample = np.random.random([num_pop, 5])
random_numbers = np.random.random([num_samples, num_pop])
samples = np.argsort(random_numbers, axis=1)[:, :pop_in_sample]
# will be shape [num_samples, pop_in_sample, 5]
row_subsets = rows_to_sample[samples, :]