我有一个非常大的2D数组,看起来像这样:

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

使用numpy,是否有一种简单的方法来获得一个新的2D数组,例如,从初始数组a中随机抽取2行(没有替换)?

e.g.

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

当前回答

如果你想生成多个随机的行子集,例如,如果你在做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, :]

其他回答

这与Hezi Rasheff提供的答案类似,但简化了,以便新的python用户能够理解发生了什么(我注意到许多新的数据科学学生以最奇怪的方式获取随机样本,因为他们不知道他们在用python做什么)。

你可以使用以下方法从数组中获取一些随机下标:

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

然后你可以使用你的numpy数组的花哨索引来获得这些索引的样本:

A[indices]

这将从数据中得到指定数量的随机样本。

如果你想生成多个随机的行子集,例如,如果你在做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, :]

可以使用随机数生成器从给定数组中生成随机样本:

rng = np.random.default_rng()
b = rng.choice(a, 2, replace=False)
b
>>> [[a4,  b4,  c4],
    [a99, b99, c99]]

我看到有人建议排列。事实上,它可以变成一行:

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

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

如果你需要相同的行,但只是一个随机样本,

import random
new_array = random.sample(old_array,x)

这里x必须是一个'int'定义你想随机选择的行数。