Python随机数组0和1

时间:2014-11-11 19:59:07

标签: python numpy random

我希望随机生成arrayn个和m个零。

我想到了这个解决方案:

  1. 生成一个数组(np.ones
  2. 生成零数组(np.zeros
  3. 将它们组合成一个数组(np.hstack
  4. 随机播放生成的数组(np.random.shuffle
  5. 似乎不是一个自然的解决方案。一些pythonic的想法?

4 个答案:

答案 0 :(得分:6)

您的解决方案似乎合理。它准确地陈述了它正在做什么,并清楚地做到了。

让我们对您的实施进行比较:

a = np.hstack((np.ones(n), np.zeros(m)))
np.random.shuffle(a)

......有一个明显的选择:

a = np.ones(n+m)
a[:m] = 0
np.random.shuffle(a)

这可能会节省一些时间不分配和移动大量数据,但需要更多的思考才能理解。

用Python代替NumPy:

a = np.array([1]*n + [0]*m)
np.random.shuffle(a)

......可能会更简洁一些,但似乎不那么惯用NumPy(就像np.array([1]*n)np.ones(n)更不惯用),而且它会变慢无缘无故地使用更多内存。 (你可以使用np.fromiter来改善记忆,但是它显然不会更简洁。)

当然,如果您不止一次这样做,真正的答案是将其分解为一个功能。然后函数的名称将解释它的作用,几乎任何不太受折磨的解决方案都很容易理解......

答案 1 :(得分:1)

我将n个数组和m个数组作为

a = np.array([1] * n + [0] * m)

然后我就打电话给np.random.shuffle()

答案 2 :(得分:0)

使用numpy.random.permutation

a = numpy.random.permutation([1] * n + [0] * m)

或者,使用数组而不是初始列表:

a = numpy.random.permutation(numpy.concatenate(np.ones(n), np.zeros(m)))

(我不太了解numpyconcatenatehstack之间的区别进行评论;它们似乎在这里产生相同的结果。)

答案 3 :(得分:0)

我认为您的解决方案很合适,因为它具有可读性和pythonic性。您没有说明内存或性能是否是考虑因素。有可能np.random.shuffle和O(m + n)一样好,但是其他答案表明它不止一次传递来改变值。你可以在O(m + n)中完成,只需要一次传递,没有像这样的内存开销:

import random
m = 600 # zeros
n = 400 # ones

result = []
while m + n > 0:
    if (m > 0 and random.random() < float(m)/float(m + n)):
        result.append(0)
        m -= 1
    else:
        result.append(1)
        n -= 1