假设X
是一个矩阵。以下命令生成一个形状为X
的矩阵,随机选择0
和1
之间的成员80%
成员为1
其余成员0
)。
srng = RandomStreams()
srng.binomial(X.shape, p=0.8)
问题是如何在1
和另一个数字2.5
之间建立类似的随机矩阵。换句话说,我需要一个形状为X
的矩阵,随机选择成员1
和2.5
之间的成员80%
成员1
其余的2.5
)
答案 0 :(得分:1)
与制作在平面中交叉2点的线的方式相同
y = m*x + a
选择m
和a
,这样当x = 0是区间的下限时,x = 1是另一个极端。
因此,对于[a,b]
区间,它是y = (b-a)x + a
在[1.2.5]的情况下,a = 1且m = 1.5,但在您的情况下a
是纯1的矩阵。
也许你的图书馆还有其他一些实用程序可以做到这一点,但是当其他一切都失败时,这总是可行的
答案 1 :(得分:0)
这样的事情怎么样?
import random
def create_matrix(width, height):
mat = []
for i in range(height):
mat.append([]) # create sublist for each height level
for _ in range(width):
# generate a random number in inclusive range [1, 5]
random_number = random.randint(1, 5)
# 80% chance the number is one of 1, 2, 3, or 4 (arbitrary; could be 1, 3, 4, or 5, just not the entire range)
if random_number in {1, 2, 3, 4}:
mat[i].append(1)
# 20% chance it's 5
else:
mat[i].append(2.5)
return mat
一个结果:
>>> print(create_matrix(10, 10))
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2.5, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2.5, 2.5], [2.5, 1, 1, 1, 1, 1, 1, 1, 1, 1], [2.5, 1, 1, 1, 1, 2.5, 1, 1, 2.5, 2.5], [1, 2.5, 1, 1, 1, 2.5, 1, 1, 2.5, 1], [1, 1, 1, 2.5, 2.5, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2.5, 1, 1, 1, 2.5, 1], [1, 2.5, 1, 1, 1, 1, 1, 1, 2.5, 1]]
我们可以验证您指定的比例1
和2.5
匹配(或非常接近)的数量:
>>> {number: [val for row in mat for val in row].count(number) for number in {1, 2.5}}
{1: 82, 2.5: 18}
通过多次迭代,这些比例将分别接近80%和20%。但随机机会会围绕这些方式产生一些变化。
请注意,这并不能确保每行至少有一个2.5
(不知道这是否与您的问题相关)。但这应该会给你一个良好的开端。
答案 2 :(得分:0)
如果您不想直接生成2.5值的矩阵,可以手动替换0值:
srng = RandomStreams()
A = srng.binomial(X.shape, p=0.8)
A[A == 0]=2.5
答案 3 :(得分:0)
您可以使用NumPy执行此操作:
import numpy as np
x = np.zeros((3, 4))
a = np.random.binomial(1, p=0.8, size=x.shape).astype(float)
a[a==0] = 2.5
现在a
看起来像这样:
array([[ 1. , 1. , 2.5, 1. ],
[ 1. , 1. , 1. , 2.5],
[ 1. , 1. , 2.5, 1. ]])
该行:
a[a==0] = 2.5
将所有0
替换为2.5
。