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], number_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]])
행의 랜덤 서브셋을 여러 개 생성하는 경우(예를 들어 LANSAC을 실행하는 경우)
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, :]
다른 방법으로는 를 사용하는 방법이 있습니다.choice
의 방법Generator
클래스, https://github.com/numpy/numpy/issues/10835
import numpy as np
# generate the random array
A = np.random.randint(5, size=(10,3))
# use the choice method of the Generator class
rng = np.random.default_rng()
A_sampled = rng.choice(A, 2)
샘플링된 데이터로 이어집니다.
array([[1, 3, 2],
[1, 2, 1]])
실행 시간은 다음과 같이 프로파일링됩니다.
%timeit rng.choice(A, 2)
15.1 µs ± 115 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.random.permutation(A)[:2]
4.22 µs ± 83.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit A[np.random.randint(A.shape[0], size=2), :]
10.6 µs ± 418 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
하지만 어레이가 커지면A = np.random.randint(10, size=(1000,300))
. 색인 작업이 가장 좋은 방법입니다.
%timeit A[np.random.randint(A.shape[0], size=50), :]
17.6 µs ± 657 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit rng.choice(A, 50)
22.3 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit np.random.permutation(A)[:50]
143 µs ± 1.33 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
그래서...permutation
어레이가 작을 때는 방법이 가장 효율적이라고 생각되지만, 어레이가 클 때는 인덱스 작업이 최적의 솔루션입니다.
같은 행이지만 랜덤 표본이 필요한 경우
import random
new_array = random.sample(old_array,x)
여기서 x는 랜덤으로 선택할 행 수를 정의하는 'int'여야 합니다.
난수 생성기를 사용하여 주어진 배열에서 랜덤 표본을 생성할 수 있습니다.
rng = np.random.default_rng()
b = rng.choice(a, 2, replace=False)
b
>>> [[a4, b4, c4],
[a99, b99, c99]]
언급URL : https://stackoverflow.com/questions/14262654/numpy-get-random-set-of-rows-from-2d-array
'programing' 카테고리의 다른 글
Prepared Statement IN 조항의 대안? (0) | 2022.11.27 |
---|---|
MariaDB의 인덱스 키 크기 제한은 얼마입니까? (0) | 2022.11.27 |
이클립스를 위한 최고의 GUI 디자이너? (0) | 2022.11.26 |
MariaDB, Sequelize 및 Node.js를 사용하여 수백만 개의 레코드를 가져와 DevExtreme PivotGrid에 표시 (0) | 2022.11.26 |
Larabel 및 웅변가 표에서 모두 선택 (0) | 2022.11.26 |