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


160

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

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

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

예 :

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

8
대체를위한 질문과없는 질문을 갖는 것은 어리석은 일입니다. 두 답변 모두 허용하고 실제로 두 답변을 권장해야합니다.
Pinocchio

답변:


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


4
이 안 좋은 방법,하지만 그냥 좋은대로하는 방법은 어쩌면이다 np.random.choice, 그리고 즉 np.random.permutation(A.shape[0])[:2], 실제로 가장 큰 아니지만, 그게 무슨입니다 np.random.choice이 시간에 ... 또는 당신이 당신의 배열 인 -을 변경할 상관하지 않는 경우 장소np.random.shuffle
seberg

1
NumPy와 1.7 전에 사용 임의 .sample (xrange (10), 2)
데니스

3
왜 변수 A와 B의 이름을 지정합니까? 읽기 어렵습니다.
Pinocchio

48

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

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

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


2
@SalvadorDali 대체로 선택하지 않도록 Hezi의 게시물을 편집했습니다. 수정 사항을 검토하면 추가 된 replace=False매개 변수가에 표시됩니다 choice.
0x24a537r9

8
@ 0x24a537r9 당신은 이것을해서는 안됩니다. 이것은 그의 대답이며 당신은 그것을 바꿉니다. 원하는 경우-답변을 추가하고 답변을 크게 변경하는 다른 사람의 답변을 변경하지 마십시오
Salvador Dali

@SalvadorDali 왜 안돼?
스콧

25

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


replace = False교체 샘플링을 원하지 않는 경우 추가 할 수 있습니다 .
Sarah

10

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

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

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

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

A[indices]

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


5

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

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

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


2

예를 들어 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, :]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.