我有一个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个元素列)。
答案 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]: