numpy:从2D数组中获取随机的行集


159

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

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

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

例如

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

8
提出一个替换问题而没有一个替换问题是很愚蠢的,您应该只允许两个答案,并且实际上鼓励两个答案。
Pinocchio

Answers:


193
>>> 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之前生成随机列表。也许您可以设置一个小的定义,以确保两个值不相同。


4
也许不是一个好方法,但是np.random.choice和一样好,也就是说np.random.permutation(A.shape[0])[:2],实际上它并不好,但是这就是目前np.random.choice的情况……或者,如果您不在乎更改数组,地点,np.random.shuffle
seberg

1
在numpy 1.7之前,请使用random .sample(xrange(10),2)
denis

3
为什么要命名变量A和B以及其他内容?它使阅读变得更加困难。
Pinocchio

48

这是旧文章,但这对我来说是最合适的:

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

将replace = False更改为True可以得到相同的结果,但是要进行替换。


2
@SalvadorDali我已经编辑了Hezi的帖子,以免被替换。编辑经过同行评审后,您将看到添加replace=False到的参数choice
0x24a537r9

8
@ 0x24a537r9您不应该这样做。这是他的答案,您可以更改它。如果您愿意-添加您的答案,请勿更改会大大改变答案的其他人的答案
Salvador Dali

@SalvadorDali为什么不呢?
斯科特

25

如果您只想按一定因素对数据进行下采样,则另一种选择是创建随机掩码。假设我想将原始数据集下采样到当前存储在数组中的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%的行(随机采样)。


10

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

您可以使用以下方法从数组中获得许多随机索引:

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

然后,可以对numpy数组使用切片,以在这些索引处获取样本:

A[indices]

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



5

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

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

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

2

如果要生成多个随机的行子集,例如,如果要执行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, :]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.