我有以下 Julia 代码来生成合成数据。
using Statistics
using Random
seed_value = 42
Random.seed!(seed_value)
f(x, t) = 3.2 * (x + 0.2t)
n_meas = 20
X = zeros(n_meas, 2)
X[:, 1] .= 1 * rand(n_meas)
X[:, 2] .= 2 * rand(n_meas)
u_meas = f.(X[:, 1], X[:, 2])
u_meas .+= 0.05 * mean(u_meas) * randn(n_meas)
print(u_meas)
生成与上面相同的数据集(u_meas)的正确Python代码是什么?
我尝试了下面的代码,但它没有打印出与我的 Julia 代码相同的结果
import numpy as np
np.random.seed(42)
def f(x, t):
return 3.2 * (x + 0.2 * t)
n_meas = 20
X = np.zeros((n_meas, 2))
X[:, 0] = 1 * np.random.rand(n_meas)
X[:, 1] = 2 * np.random.rand(n_meas)
u_meas = f(X[:, 0], X[:, 1])
u_meas += 0.05 * np.mean(u_meas) * np.random.randn(n_meas)
print("u_meas:")
print(u_meas)
最快的解决方案可能是依赖 C 标准库中的
rand
:
julia> @ccall srand(42::Int32)::Cint
1
julia> @ccall rand()::Int32
71876166
julia> @ccall rand()::Int32
708592740
In [1]: from ctypes import CDLL
In [2]: libc = CDLL("libc.so.6")
...: libc.srand(42)
Out[2]: 1
In [3]: libc.rand()
Out[3]: 71876166
In [4]: libc.rand()
Out[4]: 708592740
当然,您必须编写一些额外的代码才能将生成的 32 位整数转换为浮点数(参见此处)。需要注意的是,这“不是一个好的随机生成器”,但这是否重要取决于您的预期用途。
调用 python->julia 或 julia-> python。与使用 C 中的 rand
相比,这样做的优点是 C 的
rand
非常糟糕(无论是在随机数的质量方面,还是因为这样做需要您自己实现所有采样算法。)