[python] Numpy : 2D 배열에서 임의의 행 집합 가져 오기

다음과 같은 매우 큰 2D 배열이 있습니다.

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

numpy를 사용하면 초기 배열에서 2 개의 임의 행을 가진 새로운 2D 배열을 얻는 쉬운 방법이 a있습니까?

예 :

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



답변

>>> 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 이전에 임의의 목록을 교체하지 않고 생성하는 좋은 방법이 없다고 생각합니다. 아마도 두 값이 같지 않도록 작은 정의를 설정할 수 있습니다.


답변

이것은 오래된 게시물이지만 이것이 나에게 가장 적합한 것입니다.

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

replace = False를 True로 변경하여 동일한 것을 가져 오되 교체하십시오.


답변

또 다른 옵션은 특정 요인으로 데이터를 다운 샘플링하려는 경우 임의 마스크를 만드는 것입니다. 현재 배열에 유지되는 원래 데이터 세트의 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 %를 호출 하고 반환 할 수 있습니다 .


답변

이것은 Hezi Rasheff가 제공 한 것과 비슷한 대답이지만 단순화 된 파이썬 사용자는 무슨 일이 일어나고 있는지 이해합니다 (많은 새로운 데이터 과학 학생들이 파이썬에서 무슨 일을하는지 모르기 때문에 가장 이상한 방식으로 임의의 샘플을 가져 오는 것을 알았습니다).

다음을 사용하여 배열에서 여러 개의 임의 인덱스를 얻을 수 있습니다.

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

그런 다음 numpy 배열과 슬라이싱을 사용하여 해당 인덱스에서 샘플을 얻을 수 있습니다.

A[indices]

그러면 데이터에서 지정된 수의 무작위 샘플을 얻을 수 있습니다.


답변

순열이 제안 된 것을 확인했습니다. 실제로 한 줄로 만들 수 있습니다.

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

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


답변

동일한 행이 필요하지만 임의의 샘플 만 필요한 경우,

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

여기서 x는 무작위로 선택하려는 행 수를 정의하는 ‘int’여야합니다.


답변

예를 들어 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, :]