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가 제공 한 것과 비슷한 대답이지만 단순화 된 최신 Python 사용자는 진행 상황을 이해합니다 (많은 새로운 데이터 과학 학생들이 파이썬에서 무슨 일을하는지 모르기 때문에 가장 이상한 방식으로 임의의 샘플을 가져 오는 것을 알았습니다).
다음을 사용하여 배열에서 여러 개의 임의 인덱스를 얻을 수 있습니다.
indices = np.random.choice(A.shape[0], amount_of_samples, replace=False)
그런 다음 numpy 배열에 슬라이싱을 사용하여 해당 인덱스에서 샘플을 얻을 수 있습니다.
A[indices]
그러면 데이터에서 지정된 수의 무작위 샘플을 얻을 수 있습니다.
동일한 행이 필요하지만 임의의 샘플 만 필요한 경우,
import random
new_array = random.sample(old_array,x)
Here x, has to be an 'int' defining the number of rows you want to randomly pick.
I see permutation has been suggested. In fact it can be made into one line:
>>> A = np.random.randint(5, size=(10,3))
>>> np.random.permutation(A)[:2]
array([[0, 3, 0],
[3, 1, 2]])
If you want to generate multiple random subsets of rows, for example if your doing 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, :]
참고URL : https://stackoverflow.com/questions/14262654/numpy-get-random-set-of-rows-from-2d-array
'Programing' 카테고리의 다른 글
이미지 크기를 얻는 빠른 방법 (파일 크기가 아님) (0) | 2020.07.02 |
---|---|
왜 문자열을 부를 수 없습니까? (0) | 2020.07.02 |
REST API-DTO? (0) | 2020.07.02 |
$ 적용 진행 중 오류 (0) | 2020.07.02 |
변수를 설정하고 사용하는 CMake 구문은 무엇입니까? (0) | 2020.07.02 |