如何解决生成每个元素具有唯一范围的numpy矩阵
我正在尝试生成随机矩阵。但是,随机矩阵的每个元素都有不同的范围。因此,我想生成一个随机矩阵,以便每个元素在该范围内具有该随机数。到目前为止,我已经能够生成具有唯一列范围的矩阵:
c1 = np.random.uniform(low=2,high=1000,size=(15,1))
c2 = np.random.uniform(low=0.001,high=100,1))
c3 = np.random.uniform(low=30,high=10000,1))
c4 = np.random.uniform(low=1,high=25,1))
mtx = np.concatenate((c1,c2,c3,c4),axis=1)
现在mtx中行的低位和高位也有很大不同。如何生成这样的随机矩阵,使每个行元素也具有唯一的范围而不仅仅是列?
解决方法
类似的事情可能会起作用:
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,:]
,
我认为实现以下目标所需要做的事情:
- 为每一列和每一行指定
low
和high
- 检查每个元素的可采样范围(这意味着其行和列所施加的两个范围中的最高
low
和最低high
) - 使用元素指定的高和低分别对每个元素进行抽样(均匀分布)。
现在,每一行中的每个元素肯定会在该行的范围内,并且列中的元素也将相同。
尽管不要在行和列中选择互斥范围,但应小心。
这里说的是一些执行此操作的代码(带有注释):
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 columm
# 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,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。