Python:如何在随机位置生成具有非零项的向量?

时间:2014-10-15 14:47:17

标签: python numpy

我想使用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,我怀疑有更优雅的解决方案。

3 个答案:

答案 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随机索引。