【问题标题】:Generate numpy matrix with unique range for each element为每个元素生成具有唯一范围的 numpy 矩阵
【发布时间】:2021-02-06 06:29:43
【问题描述】:

我正在尝试生成随机矩阵。但是,随机矩阵的每个元素都有不同的范围。所以我想生成一个随机矩阵,使每个元素在该范围内都有该随机数。到目前为止,我已经能够生成具有唯一列范围的矩阵:

c1 = np.random.uniform(low=2, high=1000, size=(15,1))
c2 = np.random.uniform(low=0.001, high=100, size=(15,1))
c3 = np.random.uniform(low=30, high=10000, size=(15,1))
c4 = np.random.uniform(low=1, high=25, size=(15,1))

mtx = np.concatenate((c1,c2,c3,c4), axis=1)

现在 mtx 中的行的低和高也有很大不同。如何生成这样的随机矩阵,每个行元素也具有唯一的范围而不仅仅是列?

【问题讨论】:

  • 每个行元素也具有唯一范围是什么意思?
  • 你的意思是 matix 中的每个元素都应该落在两个不同的均匀分布的范围内吗?

标签: python-3.x numpy random numpy-ndarray


【解决方案1】:

这样的事情可能会起作用:

low  = np.array([   2, 0.001,    30,  1])
high = np.array([1000,   100, 10000, 25])
l = 15

mtx = np.random.rand((l,) + low.shape) * (high - low)[None, :] + low[None, :]

【讨论】:

    【解决方案2】:

    我认为你需要做的是以下几点:

    1. 为每一列和每一行指定lowhigh
    2. 检查每个元素的采样范围是什么(这意味着其行和列强加的两个范围中的最高 low 和最低 high
    3. 使用元素指定的高低分别(从均匀分布中)采样每个元素。

    现在每行中的每个元素肯定会在行的范围内,列中的元素也是如此。

    您应该小心,但不要在行和列中选择互斥范围。

    这里说的是一些执行此操作的代码(使用 cmets):

    import numpy as np
    from numpy.random import randint
    n_rows = 15
    n_cols = 4
    
    # here I make random highs and lows for each row and column
    # these are lists of tuples like this: [(39, 620), (83, 123), (67, 243), (77, 901)]
    # where each tuple contains the low and high for the column (or row). 
    ranges_rows = [ (randint(0,100), randint(101, 1001)) for _ in range(n_rows) ]
    ranges_cols = [ (randint(0,100), randint(101, 1001)) for _ in range(n_cols) ]
    
    # make an empty matrix
    mtx = np.empty((n_rows, n_cols))
    
    # fill in the matrix
    for x in range(n_rows): 
        for y in range(n_cols):
            # get the specified low and high for both the column and row of the element
            row_low, row_high = ranges_rows[x]
            col_low, col_high = ranges_cols[y]
            
            # the low and high for each element should be within range of both the
            # row and column restrictions
            elem_low  = max([row_low, col_low])
            elem_high = min([row_high, col_high])
            
            # get the element within the range
            rand_elem = np.random.uniform(low=elem_low, high=elem_high)
            # put it in its right place in the matrix
            mtx[x,y] = rand_elem
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-21
      • 2016-11-27
      • 2020-11-26
      • 2022-06-10
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多