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

高效创建每行含0到N无重复随机排列的N×M numpy二维数组

生成N×M无重复随机排列数组的实用方案

嘿,你的思路完全在线!用random.sample搭配列表推导式来生成每行的随机无重复序列,再转成numpy数组,对于中小规模的场景来说既直观又好用。就像你给出的示例(N=10,M=5):

import random
import numpy as np
N = 10
M = 5
a = np.array([random.sample(range(N), N) for _ in range(M)])

这段代码确实能生成M行,每行都是0到N-1的无重复随机排列,完美匹配你的需求。

不过如果你的数据规模比较大,或者想更贴合numpy的原生操作,这里还有两个更高效的方案:

方案一:numpy逐行原地打乱

不需要依赖random模块,用numpy自带的工具就能搞定:

import numpy as np
N = 10
M = 5
# 先快速生成M行重复的0到N-1有序序列
base_array = np.tile(np.arange(N), (M, 1))
# 逐行对序列进行原地打乱
for row in base_array:
    np.random.shuffle(row)
print(base_array)

np.tile能帮你快速复制出M行相同的有序序列,再用np.random.shuffle对每行进行原地打乱,操作简单且numpy的底层实现效率更高。

方案二:批量处理所有行(大数据量友好)

如果M和N都比较大,逐行循环的效率可能不够看,试试用np.apply_along_axis一次性处理所有行:

import numpy as np
N = 10
M = 5
# 生成基础的M×N有序数组
base_array = np.tile(np.arange(N), (M, 1))
# 沿着每行的方向应用随机排列
result_array = np.apply_along_axis(np.random.permutation, axis=1, arr=base_array)
print(result_array)

np.apply_along_axis会自动遍历每一行,用np.random.permutation生成该行的随机排列,避免了手动循环,在数据量较大时优势明显。

小提醒

  • 注意你需求里提到的“0到N”,但示例里用的是range(10)(对应0-9),如果确实需要包含N的话,记得把range(N)改成range(N+1),同时每行的长度也会变成N+1~
  • 如果需要固定随机结果方便调试,可以在代码开头加上np.random.seed(123)(或者你喜欢的任意数字)来锁定随机种子。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:57:35