你做了很多不同的事情。
首先,在MATLAB中使用rand,它返回一个介于0和1之间的随机浮点。在python中,使用的是randint,它返回一个随机整数。您正在执行randint(0, 1),这意味着“从0到1的随机整数,不包括0”。所以它永远是1。您需要random.random(),它返回一个介于0和1之间的随机浮点数。
接下来,您将在MATLAB中计算down和up,但是在Python中,您在Python中计算down或up。对于特定的概率情况,这些结果是相同的,但它们在语法上是不同的。在本例中,您可以使用与matlabforpython几乎相同的语法。
最后,您为MATLAB计算的样本比Python多得多(大约是10倍)。
这里是您的MATLAB代码到Python的直接端口。对我来说,结果与您的MATLAB示例几乎相同(当然,有不同的随机数):import random
import matplotlib.pyplot as plt
prob = [0.05, 0.95] # Probability to move up or down
start = 2 #Start at 2
positions = [start]
for _ in range(1, 1000):
rr = random.random()
down = rr < prob[0] and positions[-1] > 1
up = rr > prob[1] and positions[-1] < 4
positions.append(positions[-1] - down + up)
plt.plot(positions)
plt.show()
如果速度是一个问题,您可以通过使用np.random.random(1000)预先生成随机数,并以矢量化的方式预先进行概率比较来加快速度。在
所以像这样:
^{pr2}$
编辑:为了进一步解释第二个例子,基本上我所做的是预先计算每一步的概率是低于第一个阈值还是高于第二个阈值。这比计算随机样本并在循环的每个步骤进行比较要快得多。然后我使用zip将这两个随机序列组合成一个序列,其中每个元素都是两个序列中对应的元素对。假设是Python3,如果使用的是Python2,则应该使用itertools.izip,而不是{}。在
所以大致相当于:import random
import numpy as np
import matplotlib.pyplot as plt
prob = [0.05, 0.95] # Probability to move up or down
start = 2 #Start at 2
positions = [start]
rr = np.random.random(1000)
downp = rr < prob[0]
upp = rr > prob[1]
for i in range(len(rr)):
idownp = downp[i]
iupp = upp[i]
down = idownp and positions[-1] > 1
up = iupp and positions[-1] < 4
positions.append(positions[-1] - down + up)
plt.plot(positions)
plt.show()
在python中,通常倾向于迭代值,而不是索引。几乎从来没有过需要迭代索引的情况。如果你发现自己在做一些类似for i in range(len(foo)):或类似的事情,你几乎肯定是在做错事。您应该直接迭代foo,或者如果您需要其他内容的索引,您可以使用类似于for i, ifoo in enumerate(foo):的内容,这样可以获得foo的元素及其索引。
由于MATLAB语言的各种限制,在MATLAB中迭代索引是很常见的。从技术上讲,可以做一些类似于我在MATLAB中的Python示例中所做的事情,但是在MATLAB中,它需要大量的样板来保证安全,而且在大多数情况下会非常缓慢。然而,在Python中,它是最快和最干净的方法。