我有一个值数组,并希望从中创建一个矩阵,其中每一行是我的起点向量乘以(正态)分布的样本。 然后,该矩阵的行数将根据我想要的样本数量而变化。
%pylab
my_vec = array([1,2,3])
my_rand_vec = my_vec*randn(100)
上一个命令不起作用,因为数组形状不匹配。
我可以考虑使用for
循环,但我正在尝试利用数组操作。
答案 0 :(得分:2)
它是载体的外在产品:
my_rand_vec = numpy.outer(randn(100), my_vec)
答案 1 :(得分:2)
试试这个
my_rand_vec = my_vec[None,:]*randn(100)[:,None]
对于小数字,我得到例如
import numpy as np
my_vec = np.array([1,2,3])
my_rand_vec = my_vec[None,:]*np.random.randn(5)[:,None]
my_rand_vec
# array([[ 0.45422416, 0.90844831, 1.36267247],
# [-0.80639766, -1.61279531, -2.41919297],
# [ 0.34203295, 0.6840659 , 1.02609885],
# [-0.55246431, -1.10492863, -1.65739294],
# [-0.83023829, -1.66047658, -2.49071486]])
您的解决方案my_vec*rand(100)
不起作用,因为*
对应于逐元素乘法,只有当两个数组具有相同的形状时才会有效。
您需要做的是使用[None,:]
和[:,None]
添加其他维度,以使numpy的broadcasting有效。
作为附注,我建议不要使用pylab
。相反,请使用import as
以包含指出here的模块。
答案 2 :(得分:2)
您可以将所需数组的维度传递给numpy.random.randn
:
my_rand_vec = my_vec*np.random.randn(100,3)
要将每个向量乘以相同的随机数,您需要添加一个额外的轴:
my_rand_vec = my_vec*np.random.randn(100)[:,np.newaxis]