You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现NumPy数组的5次随机重排后平铺拼接?

随机打乱并重复平铺NumPy数组的最优实现

问题描述

假设我有一个数组:

import numpy as np

A = np.linspace(1,5,5)
# 等价于
A = np.array([1,2,3,4,5])

需要将其平铺5次,每次平铺时随机打乱元素顺序,最终得到类似如下的一维数组:

B = np.array([1,2,3,4,5,1,5,2,3,4,3,4,5,1,2,3,5,1,2,4,2,3,1,4,5])

注:第一个平铺块无需保持有序或随机化,怎么简便怎么来。

最优实现方案

方案1:简洁高效的拼接方式

直接生成多个打乱后的数组副本,再拼接成一维数组。如果第一个块想直接用原数组(无需打乱),可以调整循环次数:

# 方式1:所有块都随机打乱(包括第一个)
B = np.concatenate([np.random.permutation(A) for _ in range(5)])

# 方式2:第一个块用原数组,后4个随机打乱
B = np.concatenate([A] + [np.random.permutation(A) for _ in range(4)])

说明:np.random.permutation(A)会返回A的随机打乱副本,np.concatenate负责将多个数组拼接成一维,整个过程利用NumPy的C级内置操作,比Python循环逐个添加元素高效得多,尤其适合大规模数组或多次重复的场景。

方案2:基于tile的向量化打乱

如果偏好先复制再打乱的思路,可以用np.tile生成重复数组,再对每一行打乱后展平:

# 生成5行重复的数组
tiled_arr = np.tile(A, (5, 1))
# 对每一行生成随机索引,实现打乱
shuffle_indices = np.random.rand(*tiled_arr.shape).argsort(axis=1)
# 根据索引提取元素并展平
B = tiled_arr[np.arange(tiled_arr.shape[0])[:, None], shuffle_indices].ravel()

说明:这种方式同样是向量化操作,性能和方案1接近,但代码稍复杂,适合需要对重复后的数组做额外处理的场景。

性能对比

两种方案都避免了Python层面的循环,利用NumPy的向量化特性,在数组规模较大时,性能远高于手动循环逐个生成元素的方式。其中方案1的代码更简洁直观,是日常场景的首选。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:15:58