避免在使用多个python列表时使用'i'进行索引
下面是在生成一些合成数据时出现的 示例代码:避免在使用多个python列表时使用'i'进行索引,python,pandas,numpy,Python,Pandas,Numpy,下面是在生成一些合成数据时出现的 示例代码: 将numpy导入为np def示例( *, n_vars=4, n=10, flag_1=真, flag_2=真, flag_3=真, ): 数据={} 如果标志_1: 刻度=[2用于范围(n)] 其他: 刻度=[np.random.randint(0,10)表示范围(n)] 如果标志_2: locs=[2用于范围内(n)] 其他: locs=[np.random.randint(0,10)表示范围(n)] 对于范围内的i(n_变量): 数据[f“v
将numpy导入为np
def示例(
*,
n_vars=4,
n=10,
flag_1=真,
flag_2=真,
flag_3=真,
):
数据={}
如果标志_1:
刻度=[2用于范围(n)]
其他:
刻度=[np.random.randint(0,10)表示范围(n)]
如果标志_2:
locs=[2用于范围内(n)]
其他:
locs=[np.random.randint(0,10)表示范围(n)]
对于范围内的i(n_变量):
数据[f“var{i}]=np.random.normal(loc=locs[i],scale=scales[i],size=n)
返回pd.DataFrame(数据)
我不确定的是如何使用多个列表中的值以及计数器。在循环中使用locs[i]
感觉很不自然(至少在python中是这样)。但是使用类似于enumerate(some_list)
的方法在这里不起作用(因为我有多个列表),而zip(list1,list2)
也不起作用,因为我需要计数器
类似于enumerate(zip(list_1,list_2))
的东西可以在每次迭代中提供一个计数器和一个元组,尽管如果我有三个列表,感觉它也会崩溃
以下是另一种方法:
将numpy导入为np
def示例2(
*,
n_vars=4,
n=6,
flag_loc=真,
flag_scale=True,
):
数据={}
np.随机种子(1)
#为loc/scale构建阵列
random_data=np.random.randint(0,10,size=(n_变量,2))
随机数据[:,0]=随机数据[:,0]*int(标志位置)+int(非标志位置)*2
随机数据[:,1]=随机数据[:,1]*int(标志刻度)+int(非标志刻度)*2
随机数据=pd.DataFrame(
{
“locs”:np.random.randint(0,10,size=(n_变量))
如果旗标锁定
else[2]*n_vars,
“尺度”:np.random.randint(0,10,size=(n_变量))
如果旗标
else[2]*n_vars,
}
)
对于随机_数据中的i,r.ItErrors():
数据[f“x{i}”]=np.random.normal(loc=r[“locs”],scale=r[“scales”],size=n)
返回pd.DataFrame(数据)
返回
x0 x1 x2 x3
0 5.559480 11.236594 5.726233 4.749504
1 10.261197 9.111226 8.827740 3.053234
2 9.386170 9.753313 -1.567655 3.090958
3 5.465608 9.752270 8.942386 3.829324
4 9.626370 8.671618 -0.524433 7.006377
5 10.674446 8.830913 -1.629373 6.321282
这也许是一个更好的,但仍然觉得它缺乏
解决方案
我理解可能存在一些主观性——但我确实觉得python中有一种比我所写的更好的方法。我很高兴有一个解决方案可以使用基本python,或者包含numpy/pandas。您可以使用zip()
一次循环浏览多个列表,还可以更深入地使用列表理解
import numpy as np
import pandas as pd
def example(*, n_vars=4, n=10, flag_1=True, flag_2=True, flag_3=True):
data = {}
scales = [2 if flag_1 else np.random.randint(0, 10) for _ in range(n)]
locs = [2 if flag_2 else np.random.randint(0, 10) for _ in range(n)]
data = {f"var_{i}": np.random.normal(loc=loc, scale=scale, size=n) for i, loc, scale in zip(range(n_vars), locs, scales)}
return pd.DataFrame(data)
print(example())
我也用一些很好的听写理解更新了我的答案:)