如何构造Numpy中满足子矩阵一致性的随机矩阵生成函数?
生成Numpy中随机n维无限数组的初始段(二维情况)
原函数random_matrix每次调用都会重新初始化随机数生成器,导致不同尺寸的矩阵重叠区域数值不一致。我们需要构造函数f,使得任意调用f(r1, c1)和f(r2, c2)时,二者的重叠子矩阵(即前min(r1, r2)行、min(c1, c2)列的部分)完全相同,相当于从一个“无限大的随机矩阵”中截取指定大小的初始段。
实现方案
核心思路是用全局变量维护同一个随机数生成器和已生成的缓存矩阵,每次调用时仅扩展缓存至所需尺寸,确保所有生成的随机数都来自同一序列,重叠区域复用已生成的数值:
import numpy as np # 全局维护随机数生成器与缓存矩阵 _global_rng = np.random.default_rng(0) _global_cache = np.array([[]]) def f(rows, cols): global _global_rng, _global_cache current_rows, current_cols = _global_cache.shape # 扩展行数至目标值 if rows > current_rows: add_rows = rows - current_rows # 若缓存为空,新增列数直接用目标列数;否则沿用现有列数 target_cols = current_cols if current_cols > 0 else cols new_rows = _global_rng.random((add_rows, target_cols)) _global_cache = np.vstack([_global_cache, new_rows]) # 扩展列数至目标值 if cols > current_cols: add_cols = cols - current_cols # 若缓存为空,新增行数直接用目标行数;否则沿用现有行数 target_rows = current_rows if current_rows > 0 else rows new_cols = _global_rng.random((target_rows, add_cols)) _global_cache = np.hstack([_global_cache, new_cols]) # 返回指定尺寸的初始段副本,避免外部修改缓存 return _global_cache[:rows, :cols].copy()
验证逻辑
执行以下代码可验证重叠区域一致性:
mat1 = f(2, 3) mat2 = f(3, 4) # 输出应为True,说明重叠区域完全相同 print(np.array_equal(mat1, mat2[:2, :3]))
内容的提问来源于stack exchange,提问作者gmr
相关产品推荐
相关产品推荐

