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

gha*_*gha 134 python numpy

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

a=
[[a1, b1, c1],
 [a2, b2, c2],
 ...,
 [an, bn, cn]]
Run Code Online (Sandbox Code Playgroud)

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

例如

b=
[[a4,  b4,  c4],
 [a99, b99, c99]]
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 165

>>> 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]])
Run Code Online (Sandbox Code Playgroud)

将它放在一起用于一般情况:

A[np.random.randint(A.shape[0], size=2), :]
Run Code Online (Sandbox Code Playgroud)

对于非替换(numpy 1.7.0+):

A[np.random.choice(A.shape[0], 2, replace=False), :]
Run Code Online (Sandbox Code Playgroud)

我不相信有一种很好的方法可以在1.7之前无需替换就生成随机列表.也许您可以设置一个小的定义,以确保两个值不相同.

  • 也许不是一个好方法,但这种方式和`np.random.choice`一样好,那就是`np.random.permutation(A.shape [0])[:2]`,实际上它不是很好,但这就是当前的`np.random.choice` ......或者如果你不关心就地改变你的数组,`np.random.shuffle` (4认同)
  • @CharlieParker 是吗?矩阵通常用单个大写字母表示。 (3认同)
  • 为什么要命名变量A和B以及其他东西?它使阅读更难. (2认同)

Hez*_*eff 43

这是一篇很老的帖子,但这对我来说最有用:

A[np.random.choice(A.shape[0], num_rows_2_sample, replace=False)]
Run Code Online (Sandbox Code Playgroud)

将replace = False更改为True以获得相同的内容,但需要替换.

  • @ 0x24a537r9你不应该这样做.这是他的答案,你改变它.如果你想 - 添加你的答案,不要改变显着改变答案的其他人的答案 (7认同)
  • @SalvadorDali 我编辑了 Hezi 的帖子,不选择替换。一旦编辑经过同行评审,您将看到添加到“choice”的“replace=False”参数。 (4认同)
  • @SalvadorDali 为什么不呢? (2认同)

iso*_*eel 23

如果您只想按特定因子对数据进行下采样,则另一种方法是创建随机掩码.假设我想要下采样到原始数据集的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])
Run Code Online (Sandbox Code Playgroud)

现在你可以调用data_arr[mask]并返回约25%的行,随机抽样.


CB *_*sen 6

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

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

indices = np.random.choice(A.shape[0], amount_of_samples, replace=False)
Run Code Online (Sandbox Code Playgroud)

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

A[indices]
Run Code Online (Sandbox Code Playgroud)

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

  • 似乎是最好的解决方案,应该是选定的答案。“*然后您可以使用切片*”,拼写错误:[花式索引](https://scipy-lectures.org/intro/numpy/array_object.html#indexing-with-an-array-of-integers)。 (2认同)

小智 5

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

import random
new_array = random.sample(old_array,x)
Run Code Online (Sandbox Code Playgroud)

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

  • 这只适用于`old_array`是序列或集合,而不是numpy数组[link](https://docs.python.org/3/library/random.html#functions-for-sequences) (3认同)

小智 5

我看到已建议排列。其实可以写成一行:

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

array([[0, 3, 0],
       [3, 1, 2]])
Run Code Online (Sandbox Code Playgroud)