%pylab inline from scipy.stats import lognorm, norm m = .0 s = .5 # marginal CDF and inverse CDF F = lambda X: lognorm.cdf(X, s, m) invF = lambda Y: lognorm.ppf(Y, s, m) x = linspace(0.001, 10, 100) N = 300 # generate data A = asarray([[.2, 2], [.5, 1.]]) b = asarray([[.1], [.1]]) Y = rand(2, N) X = dot(A, invF(Y)) + b figure(figsize=(8.5, 4)) subplot(1, 2, 1) plot(X[0], X[1], 'k.') xlim([0, 6]) ylim([-1, 5]) subplot(1, 2, 2) # remove skewness L = cholesky(cov(X)) c = mean(X, 1)[:, None] Z = dot(L, norm.ppf(F(dot(inv(A), X - b)))) + c plot(Z[0], Z[1], 'r.') xlim([0, 6]) ylim([-1, 5])