numpy - 使用np.random.choice

时间:2015-10-30 13:04:31

标签: python arrays math numpy numerical-methods

我有一个2D数组,其中每一行都是一个方向:

directions = np.array([[ 1, 0],
                       [-1, 0],
                       [ 0, 1],
                       [ 0,-1]])

我想从中抽取几行,然后执行cumsum(模拟随机游走)。最好的方法是使用np.random.choice。例如,要采样10个步骤,请执行以下操作:

np.random.choice(directions, size=(10,1))
# returns 2D array of shape (10,2), where each row is
# randomly sampled from the previous one

当我运行时,我收到错误:

ValueError: a must be 1-dimensional

现在,我意识到我有一个2D数组,但在这种情况下,它不应该像1D数组的1D数组一样吗?这不是广播规则的运作方式吗?

所以,我的问题是如何使这个2D数组作为一维数组的一维数组(即2个元素列)。

2 个答案:

答案 0 :(得分:4)

最简单的事情可能是使用索引。 choice的第一个参数描述如下:

  

如果是ndarray,则从其元素生成随机样本。如果是int,则生成随机样本,就好像a是np.arange(n)

你可以这样做:

directions = np.array([[ 1, 0],
                       [-1, 0],
                       [ 0, 1],
                       [ 0,-1]])
sampleInd = np.random.choice(directions.shape[0], size=(10,))
sample = directions[sampleInd]

请注意,如果您希望结果为2D数组,请将选项输出指定为1D (10,)向量而不是(10, 1),即2D。

现在随机游走的最终目的地是

destination = np.sum(sample, axis = 0)

参数axis = 0是必要的,因为否则sum会将2D sample数组中的所有元素相加,而不是分别添加每列。

答案 1 :(得分:0)

numpy.random.choice的替代方法是在标准库中使用random.choice

In [1]: import numpy as np

In [2]: directions = np.array([[1,0],[-1,0],[0,1],[0,-1]])

In [3]: directions
Out[3]: 
array([[ 1,  0],
       [-1,  0],
       [ 0,  1],
       [ 0, -1]])

In [4]: from numpy.random import choice

In [5]: choice(directions)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-dd768952d6d1> in <module>()
----> 1 choice(directions)

mtrand.pyx in mtrand.RandomState.choice (numpy/random/mtrand/mtrand.c:10365)()

ValueError: a must be 1-dimensional

In [6]: import random

In [7]: random.choice(directions)
Out[7]: array([ 0, -1])

In [8]: choices = []

In [9]: for i in range(10):
   ...:     choices.append(random.choice(directions))
   ...:     

In [10]: choices
Out[10]: 
[array([1, 0]),
 array([ 0, -1]),
 array([ 0, -1]),
 array([-1,  0]),
 array([1, 0]),
 array([ 0, -1]),
 array([ 0, -1]),
 array([ 0, -1]),
 array([-1,  0]),
 array([1, 0])]

In [11]: