python - 随机拆分一个numpy数组

标签 python numpy

我有一个大小为 46928x28x28 的 numpy 数组,我想将该数组随机拆分为两个大小为 (41928x28x28)(5000x28x28) 的子矩阵。因此,要从初始数组中随机选择行。到目前为止我尝试的代码(计算两个子数组的索引)如下:

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,) 而其余的形状是 (42192,)。在那种情况下我做错了什么?

最佳答案

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

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

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

也就是说,由于对列表进行迭代,您的代码的第二行非常慢。使用 bool 值向量定义所需的索引会快得多,这将允许您使用否定运算符 ~

choice = np.random.choice(range(matrix.shape[0]), size=(5000,), replace=False)    
ind = np.zeros(matrix.shape[0], dtype=bool)
ind[choice] = True
rest = ~ind

在我的机器上,这个方法与实现 scikit.learn 的 train_test_split 一样快,这让我觉得两者在做完全相同的事情。

关于python - 随机拆分一个numpy数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491630/

相关文章:

python - sympy 表达式的 numpy 数组中某些符号的数值计算

python - 如何在 Python 上制作 3D 图形动画

python - 无法将 datetime.datetime 与 numpy.ndarray 进行比较

python - 为什么 python statistics.mean() 返回一个 int 类型,而不是 float

python - 类型错误 : unsupported operand type(s) for ** or pow(): 'list' and 'int' and Invalid arguments error

python - 如何使用 Streaming API 通过 Twitter 跟踪 400 个关键字?

python - 如何使装饰器对调试器透明

python - Python-语音识别时间偏移

python - Matplotlib 类似于 matlab trisurf

python - 通过串行方式将 float 作为字节从 Python 程序发送到 Arduino