Numpy选择没有替换特定维度

时间:2016-10-12 15:42:44

标签: python numpy

如果没有替换,我会根据指定的分布从n个不同的时间选择k个元素。

迭代解决方案很简单:

for _ in range(n):
    np.random.choice(a, size=k, replace=False, p=p)

我无法设置size=(k, n)因为我会在不替换样本的情况下进行采样。 an很大,我希望有一个矢量化解决方案。

2 个答案:

答案 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)

以下是一些建议。

  1. 您可以预先分配(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)
    
  2. 您可以预先计算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)