我希望随机生成array
个n
个和m
个零。
我想到了这个解决方案:
np.ones
)np.zeros
)np.hstack
)np.random.shuffle
)似乎不是一个自然的解决方案。一些pythonic的想法?
答案 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)))
(我不太了解numpy
对concatenate
和hstack
之间的区别进行评论;它们似乎在这里产生相同的结果。)
答案 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