【发布时间】:2014-05-05 19:11:36
【问题描述】:
我有一个表示分类数据的一维数组 A(其中每个条目是某个类别的元素数):
A = array([ 1, 8, 2, 5, 10, 32, 0, 0, 1, 0])
我正在尝试编写一个函数 sample(A, N) 来生成一个数组 B ,其中包含通过从 A 中随机抽取元素生成的 N 个元素(保持类别):
>>> sample(A, 20)
array([ 1, 3, 0, 1, 4, 11, 0, 0, 0, 0])
这是我写的:
def sample(A, N):
AA = A.astype(float).copy()
Z = zeros(A.shape)
for _ in xrange(N):
drawn = random.multinomial(1, AA/AA.sum())
Z = Z + drawn
AA = AA - drawn
return Z.astype(int)
可能这很天真,有更好/更快的方法吗?也许使用一些快速的 numpy 函数? 编辑:不清楚:它必须没有替换!!!
【问题讨论】:
-
也许我在这里完全错了,但是你有没有理由不只是使用
random.multinomial(N, A/A.sum())而不是你的整个功能? -
保留类别到底是什么意思?另外,看起来您正在绘制 没有 替换?
-
您的代码看起来不能以这种方式工作。我假设您想用
Z[drawn] += 1替换Z = Z + drawn? -
@eickenberg
Z[drawn] += 1会将 1 添加到 Z 的第一个和第二个元素。Z = Z + drawn工作正常。Z[drawn == 1] += 1也可以使用 -
啊,真的,我的错——我认为它会返回索引。忘记我最后的评论
标签: python numpy statistics scipy sampling