如果没有替换,我会根据指定的分布从n个不同的时间选择k个元素。
迭代解决方案很简单:
for _ in range(n):
np.random.choice(a, size=k, replace=False, p=p)
我无法设置size=(k, n)
因为我会在不替换样本的情况下进行采样。 a
和n
很大,我希望有一个矢量化解决方案。
答案 0 :(得分:0)
所以完整的迭代解决方案是:
In [158]: ll=[]
In [159]: for _ in range(10):
...: ll.append(np.random.choice(5,3))
In [160]: ll
Out[160]:
[array([3, 2, 4]),
array([1, 1, 3]),
array([0, 3, 1]),
...
array([0, 3, 0])]
In [161]: np.array(ll)
Out[161]:
array([[3, 2, 4],
[1, 1, 3],
...
[3, 0, 1],
[4, 4, 2],
[0, 3, 0]])
这可以作为列表理解:np.array([np.random.choice(5,3) for _ in range(10)])
。
或您A=np.zeros((10,3),int)
和A[i,:]=np.random...
换句话说,您希望从range(5)
中选择,但希望它们仅在行内唯一。
np.random.choice
文档提示了另一种选择:
>>> np.random.choice(5, 3, replace=False)
array([3,1,0])
>>> #This is equivalent to np.random.permutation(np.arange(5))[:3]
我想知道我是否可以生成
array([[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4],
...
[0, 1, 2, 3, 4],
[0, 1, 2, 3, 4]])
并在行内置换值。但是使用permute
我只能将所有列混合在一起。因此,我仍然坚持在行上进行迭代以产生无需替换的选择。
答案 1 :(得分:0)
以下是一些建议。
您可以预先分配(n, k)
输出数组,然后多次选择:
result = np.zeros((n, k), dtype=a.dtype)
for row in range(n):
result[row, :] = np.random.choice(a, size=k, replace=False, p=p)
您可以预先计算n * k
选择索引,然后立即将它们应用于a
。由于您希望在不替换的情况下对索引进行采样,因此您需要再次在循环中使用np.choice
:
indices = np.concatenate([np.random.choice(a.size, size=k, replace=False, p=p) for _ in range(n)])
result = a[indices].reshape(n, k)