考虑以下随机函数,它返回的函数几乎与它收到的数字相同(它返回高斯分布中的样本,均值为D
,标准差为0.001 * x
):
x
例如:
def similar(x, rel_std=0.001):
sigma = rel_std * x
mu = x
return sigma * np.random.randn() + mu
此函数似乎适用于任意形状的数组:
> print(similar(1.0))
0.99946018
但是,正如您可能已经注意到的那样,它不会为每个单元格使用新的随机种子。我正在寻找的是一个函数,它使用任意形状的NumPy数组的每个单元的随机性。由于形状可能是任何形状,我认为嵌套> ones = np.ones(5)
> print(similar(ones))
[0.99946018 0.99946018 0.99946018 0.99946018 0.99946018]
> example = np.array([[[6,7,8,9,10],[-1,-2,-3,-4,-5]],[[1,2,3,4,5], [-2,-1,0,1,2]]])
> print(similar(example))
[[[ 6.00610123 7.0071181 8.00813497 9.00915185 10.01016872]
[-1.00101687 -2.00203374 -3.00305062 -4.00406749 -5.00508436]]
[[ 1.00101687 2.00203374 3.00305062 4.00406749 5.00508436]
[-2.00203374 -1.00101687 0. 1.00101687 2.00203374]]]
- 循环不可用。
另一个要求是即使对于形状数组(1024,1024),该方法也应该合理快速地工作。 有没有办法编写快速(例如通过矢量化)功能执行上述任务?
编辑:我不介意改变for
的定义,或者使用不同界面的函数 - 只要该建议符合生成“相似”矩阵的目的。
答案 0 :(得分:1)
我认为你的类似功能并不像你想象的那样有效。 你的函数生成一个随机数* sigma(这是一个标量),并将这个相同的标量添加到mu == x中的所有单元格。
更改np.random.randn以输出形状为x的randn矩阵可以解决问题。
%p