Numpy: 2B diziden rastgele satır kümesi al


160

Ben böyle bir şey görünüyor çok büyük bir 2D dizisi var:

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

Numpy kullanarak, ilk diziden 2 rastgele satır içeren yeni bir 2D dizi elde etmenin kolay bir yolu var mı a(değiştirmeden)?

Örneğin

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

8
değiştirme için bir soruya sahip olmak aptalca, sadece hem cevaplara izin vermeli hem de aslında her iki yanıtı da teşvik etmelisiniz.
Pinokyo

Yanıtlar:


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]])

Genel bir dava için bir araya getirmek:

A[np.random.randint(A.shape[0], size=2), :]

Değişim için (numpy 1.7.0+):

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

1.7'den önce yedek olmadan rastgele liste oluşturmanın iyi bir yolu olduğuna inanmıyorum. Belki de iki değerin aynı olmamasını sağlayan küçük bir tanım ayarlayabilirsiniz.


4
Belki de iyi bir yol yoktur, ama en az onun kadar iyi bir yol vardır np.random.choiceve bu np.random.permutation(A.shape[0])[:2]aslında büyük değildir, ama şu np.random.choiceanda budur ... ya da dizinizi değiştirmeyi umursamıyorsanız- yer,np.random.shuffle
seberg

1
Numpy 1.7'den önce rastgele .sample (xrange (10), 2)
denis

3
neden A ve B değişkenlerinizi ve diğer şeyleri adlandırıyorsunuz? okumayı zorlaştırır.
Pinokyo

48

Bu eski bir gönderi, ama benim için en iyi olan şey bu:

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

Aynı şeyi elde etmek için replace = False değerini True olarak değiştirin, ancak yenisiyle değiştirin.


2
@SalvadorDali Hezi'nin gönderisini, değiştirilmek üzere seçmemek için düzenledim. Düzenleme hakem değerlendirildikten sonra, eklenen replace=Falseparametreyi görürsünüz choice.
16:06

8
@ 0x24a537r9 bunu yapmamalısınız. Bu onun cevabı ve siz değiştiriyorsunuz. İsterseniz - cevabınızı ekleyin ve cevabı önemli ölçüde değiştiren diğer insanların cevaplarını değiştirmeyin
Salvador Dali

@SalvadorDali neden olmasın?
Scott

25

Başka bir seçenek, verilerinizi belirli bir faktörle aşağı örneklemek istiyorsanız rastgele bir maske oluşturmaktır. Diyelim ki şu anda dizide tutulan orijinal veri setimin% 25'ine aşağı örneklemek istiyorum 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])

Şimdi data_arr[mask]rastgele örneklenmiş satırların ~% 25'ini arayabilir ve döndürebilirsiniz.


replace = FalseDeğiştirme ile örnekleme yapmak istemiyorsanız eklemek isteyebilirsiniz.
Sarah

10

Bu, Hezi Rasheff'in verdiği cevaba benzer bir cevaptır, ancak daha yeni python kullanıcıları neler olduğunu anlamaları için basitleştirilmiştir (birçok yeni veri bilimi öğrencisinin rastgele örnekleri en garip yollarla aldıklarını fark ettim çünkü pitonda ne yaptığını bilmiyorlar).

Dizinizi kullanarak aşağıdakilerden bir dizi rastgele indeks alabilirsiniz:

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

Daha sonra bu dizinlerde örnekleri almak için numpy dizinizle dilimleme kullanabilirsiniz:

A[indices]

Bu, verilerinizden belirtilen sayıda rastgele örnek elde etmenizi sağlar.


5

Permütasyonun önerildiğini görüyorum. Aslında tek bir satıra yapılabilir:

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

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


2

Birden çok rasgele satır alt kümesi oluşturmak istiyorsanız, örneğin RANSAC yapıyorsa.

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, :]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.