【发布时间】:2014-10-15 14:47:17
【问题描述】:
我想使用 Numpy 生成一个 k 稀疏向量,即它有 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;请参阅 cryptogenomicon.wordpress.com/2014/10/13/… 了解类似的有趣故事。
-
“pythonic”和“numpy-onic”是有区别的。像这样的循环在 Python 中是完全正常的,尽管在合适的时候更喜欢推导式。
numpy鼓励“矢量化”操作。 -
你是对的。当我说 pythonic 时,我想我的意思是“矢量化”或“更优雅”。