随机拆分一个numpy数组

2024-03-28 15:04:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个大小为46928x28x28的numpy数组,我想把这个数组随机分成两个子矩阵,大小分别是(41928x28x28)和{}。因此,要从初始数组中随机选取行。到目前为止,我尝试的代码(为两个子数组计算索引)如下:

ind = np.random.randint(input_matrix.shape[0], size=(5000,))
rest = np.array([i for i in range(0,input_matrix.shape[0]) if i not in ind])
rest = np.array(rest)

然而,令人惊讶的是ind的形状是(5000,),而其余的形状是{}。在那种情况下我做错了什么?在


Tags: 代码innumpyrestinputnp矩阵random
3条回答

一种方法是尝试从sklearndocumentation使用train_test_split

import numpy as np
from sklearn.model_selection import train_test_split

# creating matrix
input_matrix = np.arange(46928*28*28).reshape((46928,28,28))
print('Input shape: ', input_matrix.shape)
# splitting into two matrices of second matrix by size
second_size = 5000/46928

X1, X2 = train_test_split(input_matrix, test_size=second_size)

print('X1 shape: ', X1.shape)
print('X2 shape: ', X2.shape)

结果:

^{pr2}$

我同意这样的评论:train_test_split可能是一个好办法。但是,由于它被标记为numpy,所以这里有一种numpy的方法,非常快:

# recreate random array:
x = np.random.random((46928,28,28))

# pick your indices for sample 1 and sample 2:
s1 = np.random.choice(range(x.shape[0]), 41928, replace=False)
s2 = list(set(range(x.shape[0])) - set(s1))

# extract your samples:
sample1 = x[s1, :, :]
sample2 = x[s2, :, :]

您的输出:

^{pr2}$

计时:

只是出于好奇,我将这个numpy方法与sklearn.model_selection.train_test_split进行了比较,结果差别不大。train_test_split速度更快,但只有一点点。无论如何,我认为train_test_split是更好的选择。在

方法:0.26082248413999876秒

train_test_split方法:0.2221719217000092秒

错误是randint给出了一些重复的索引。您可以通过打印len(set(ind))来测试它,您将看到它小于5000。在

要使用相同的想法,只需将第一行替换为

ind = np.random.choice(range(input_matrix.shape[0]), size=(5000,), replace=False)

也就是说,由于列表上的迭代,第二行代码相当慢。用布尔向量定义所需的索引要快得多,这将允许您使用否定运算符~。在

^{pr2}$

在我的机器上,这种方法与实现scikit.学习这让我觉得这两个人做的完全一样。在

相关问题 更多 >