programing

Numpy: 2D 어레이에서 행 집합을 무작위로 가져옵니다.

newsource 2022. 11. 27. 21:17

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