我想使用k-sparse的Numpy生成一个向量,即它有 n 条目,其中 k 非零。非零条目的位置是随机选择的,条目本身是从具有零均值和单位方差的高斯分布中选择的。测试向量很小(256个条目)所以我不认为Scipy的稀疏矩阵接口在这里是必要的。
我目前的方法是生成一个0到256之间的 k 整数的随机列表,初始化一个充满零的向量,然后使用for循环选择一个随机值并替换条目具有这些值的向量,如下:
# Construct data vector x
# Entries of x are ~N(0, 1) and are placed in the positions specified by the
# 'nonzeros' vector
x = np.zeros((256, 1))
# Get a random value ~N(0, 1) and place it in x at the position specified by
# 'nonzeros' vector
for i in range(k):
x[nonzeros[i]] = np.random.normal(mu, sigma)
性能在这里不是问题(它与研究有关)所以这有效,但感觉 unpythonic,我怀疑有更优雅的解决方案。
答案 0 :(得分:5)
这个怎么样:
In [41]: import numpy as np
In [42]: x = np.zeros(10)
In [43]: positions = np.random.choice(np.arange(10), 3, replace=False)
In [44]: x[positions] = np.random.normal(0,1,3)
In [45]: x
Out[45]:
array([ 0. , 0.11197222, 0. , 0.09540939, -0.04488175,
0. , 0. , 0. , 0. , 0. ])
答案 1 :(得分:3)
这是一个方法:首先用高斯噪声填充零向量的第一个k
元素,然后随机抽取以获得随机位置的k
。
>>> n = 10
>>> k = 3
>>> a = np.zeros(n)
>>> a[:k] = np.random.randn(k)
>>> np.random.shuffle(a)
>>> a
array([ 1.26611853, 0. , 0. , 0. , -0.84272405,
0. , 0. , 1.96992445, 0. , 0. ])
此解决方案可能比接受的解决方案更快:
>>> def rand_nz_1(n, k):
... a = np.zeros(n)
... pos = np.random.choice(np.arange(n), k, replace=False)
... a[pos] = np.random.randn(k)
... return a
...
>>> def rand_nz_2(n, k):
... a = np.zeros(n)
... a[:k] = np.random.randn(k)
... np.random.shuffle(a)
... return a
...
>>> %timeit rand_nz_1(256, 15)
10000 loops, best of 3: 63.8 µs per loop
>>> %timeit rand_nz_2(256, 15)
10000 loops, best of 3: 38.3 µs per loop
答案 2 :(得分:0)
使用random.sample(xrange(n), k)
生成k
随机索引。