在numpy中生成随机n维无限数组的初始段

92vpleto  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(196)

考虑以下函数:

def random_matrix(rows, cols):
    rng = np.random.default_rng(0)
    return rng.random((rows, cols))

我如何构造一个函数f,它能生成像random_matrix这样的随机矩阵,但具有这样的性质:对于所有的r1r2c1c2f(r1, c1)[:min(r1, r2), :min(c1, c2)]等于f(r2, c2)[:min(r1, r2), :min(c1, c2)]?(这是标题中稍微更一般的问题的二维情况。1维的情况是平凡的,因为它是numpy的正常行为。

velaa5lx

velaa5lx1#

好吧,你必须以对角线的方式填充随机矩阵,以莫顿(Z阶)曲线https://en.wikipedia.org/wiki/Z-order_curvehttps://en.wikipedia.org/wiki/Hilbert_curve的精神
更新

import numpy as np
import zCurve as z

def want_mtx(nx: int, ny: int) -> bool:

    index = z.interlace(nx-1, ny-1, dims=2)
    if index+1 == nx*ny:
        return True

    return False

上面是一个简单的函数,它告诉你使用特定的z曲线实现可以生成什么样的矩阵。
例如,want_mtx(4,2)将返回True,这意味着您可以生成可以使用z曲线索引的非方形矩阵。want_mtx(8,4)
因此可以生成具有重叠样本的矩阵

def random_matrix(rows, cols):
    rng =  np.random.default_rng(1357531)

    if not want_mtx(cols, rows):
        return None

    index = z.interlace(cols-1, rows-1, dims=2)

    mtx = np.empty((cols, rows))

    for k in range(0, index+1):
        ptidx = z.deinterlace(k, dims=2)
        mtx[ptidx] = rng.random()
    
    return mtx

例如,4x 2和8x 4矩阵的4x 2部分相同(以及8x8,16 x8等)
你可以发明自己的nd元组->线性和反函数,毕竟你更了解你的域问题。但是它总是会限制你的矩阵是如何布局的,以及允许什么维度

相关问题