如何在循环中每x步创建一个新列表?

T·L

我正在python上绘制一些随机游动函数,并尝试创建它,以便它每隔1000步获取一次随机游动的位置,然后将它们绘制在直方图中。我意识到我可以每次从字面上为n = 1000,2000等创建一个新列表,然后将walk的值附加到该列表中,但是有没有办法让python每1000个步骤创建一个新列表?

import numpy as np 
import matplotlib.pyplot as plt

def random_walk(N,d):       
    walk = d*np.cumsum(2*np.random.binomial(1,.6,N)-1)
    return walk
n1=[]
n2=[]
n3=[]
n4=[]
n5=[]

for k in range(5000):
    particular_walk = random_walk(5000,2)
    n1.append(particular_walk[1000])
    n2.append(particular_walk[2000])
    n3.append(particular_walk[3000])
    n4.append(particular_walk[4000])
    n5.append(particular_walk[-1])


plt.hist(n1,bins=20,histtype='step',density=True)
plt.hist(n2,bins=20,histtype='step',density=True)
plt.hist(n3,bins=20,histtype='step',density=True)
plt.hist(n4,bins=20,histtype='step',density=True)
plt.hist(n5,bins=20,histtype='step',density=True)
plt.show()

到目前为止,这是我的代码,但我意识到它不起作用。我知道我可以有一个名为“中点”的列表,并将其设置为特定步行路线的位置2500,但是有没有办法自动做到这一点?

疯狂物理学家

通常,在使用numpy时,您要排除使用列表。就时间和空间而言,阵列效率更高。您还应该尝试避免使用显式的Python循环,因为numpy提供的向量化将会更快。

假设您想针对样本中Z不同位置的步行进行此操作Z = 5000,但在一般情况下希望更大。您可以使用大多数numpy函数可以应用于特定轴这一事实来完成此任务:

import numpy as np 
from matplotlib import pyplot as plt

Z = 5000
N = 5000
d = 2

all_walks = d * np.cumsum(2 * np.random.binomial(1, 0.6, size=(Z, N)) - 1, axis=1)

将步骤的大小设置为,(Z, N)将为您提供一个包含Z的矩阵,每一行都有N步骤。取累加总和axis=1意味着跨列求和。现在每一行都是独立的步行。您可以使用非常基本的切片来获取所需的任何列。nth列将包含各n第th步Z您希望将“切片”列作为原因的原因在于,这种方式使绘图变得更加容易。

让我们来看看n=1000

n1k = all_walks[:, 1000]
plt.hist(n1k, bins=20, histtype='step', density=True)

到现在为止还挺好。要获取每1000个样本,请使用索引中的步长:

n = 1000
samples = all_walks[:, n::n]

samples现在是Zx(N // n)-1((5000, 4))数组,其中包含1000, 3000, 4000每个数组中索引处的步骤在此示例中,您似乎希望有五个样本。我认为可以通过三种合理的方式来做到这一点:

  1. 从索引开始0samples = all_walks[:, ::n]
  2. 从索引开始n-1samples = all_walks[:, n-1::n]
  3. 向步行添加额外的步骤(列):

    all_walks = ... size=(Z, N+1) ...
    samples = all_walks[:, n::n]
    

我不认为通过不一致地添加索引来弄乱间距-1不是一个特别好的主意。我将改用选项#2(请记住,索引999包含第1000个步骤)。

好消息是matplotlib允许您一次绘制向量的列:

plt.hist(samples, bins=20, histtype='step', density=True)

因此,整个脚本实际上很短:

import numpy as np 
from matplotlib import pyplot as plt

Z = 5000
N = 5000
d = 2
n = 1000

all_walks = d * np.cumsum(2 * np.random.binomial(1, 0.6, size=(Z, N)) - 1, axis=1)
samples = all_walks[:, n-1::n]
plt.hist(samples, bins=20, histtype='step', density=True)
plt.show()

如果由于某种原因不能一次将大小为Z * Nfloat的数组全部保存在内存中,则可以all_walks使用一次生成一个遍历的循环来实现该行,这有点像您最初尝试做的那样。请记住,仅当您制作Z数量惊人地大或由于某些原因而没有RAM时,这才行:

samples = np.empty((Z, N//n))
for row in range(Z):
    walk = d * np.cumsum(2 * np.random.binomial(1, 0.6, size=N) - 1)
    samples[row] = walk[n-1::n]

如果您从相同的随机种子开始,则这两种方法应会给您相同的结果。主要区别在于,第一个占用更多内存,而第二个占用更多时间。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在每次循环中创建一个新对象?

如何在for循环中创建一个列表,使我的所有三个爱好都在其中?

如何在for循环中每3次添加一个换行符

如何创建一个每次循环并创建一个新列表的输入?

如何在for循环中附加一个数组,每个循环都会获得新的输出?

在.each循环中创建一个新数组

在for循环中创建一个长度可变的列表

创建字典列表,每一步仅修改一个值

如何在Angular上每两个项目创建一个新的引导行?

如何在行 Excel 文件中每 4 个元素创建一个新列?

在 for 循环中的另一个列表项之后创建一个列表名称

如何在for循环中从列表中选择最后一个元素?

如何在循环中不使用以下内容擦除上一个列表?

Android:如何在一个循环中创建多个的EditText中设置DatePicker值

如何在循环中创建一个长度为 n 的整数的 python 系列

如何在for循环中使用一个输入语句创建不同的输出?

如何在for循环中仅创建一个图-MATLAB

如何使用熊猫和/或plotly在Python中每x行创建一个新表?

创建一个空的 DataFrame 并在循环中向其附加一个列表

如何在for循环中杀死一个空闲进程?

如何在 For 循环中返回一个 Promise 函数?

如何在最后一个循环中删除“AND”(每个)

为循环的每次迭代创建一个新列表

如何在循环中创建一个数组,然后在Java中循环后可以调用它?

VBA如何在第3步的循环中使用带有计数器的计数器,每次仅增加一个计数器

如何在另一个循环中循环两个循环

在R中的循环中创建xts列表时,会创建一个额外的list元素

如何在每次while循环通过时创建一个新数组

如何在每次循环迭代中创建一个新的 JSON 对象