【问题标题】:Creating new array in for loop (Python)在 for 循环中创建新数组(Python)
【发布时间】:2013-01-14 22:00:59
【问题描述】:

我正在准备一个数据集以在程序 rpy(R,它在 Python 中运行)中运行以进行统计分析。它看起来像这样:

data = [[0, 1, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 0, 0], 
[0, 1, 1, 0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[0, 0, 1, 1, , 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0, 0], 
[0, 0, 0, 0, 1, 0, 0, 0, 1, 0]]   

为了使用这些数据,我需要将因变量 (y) 与独立变量 (x) 隔离开来。我需要为每一列创建一个新列表,如下所示:

y = data[:,9]
x1 = data[:,0]
x2 = data[:,1]
x3 = data[:,2]
x4 = data[:,3]
x5 = data[:,4]
x6 = data[:,5]
x7 = data[:,6]
x8 = data[:,7]
x9 = data[:,8]
x10 = data[:,9]

假设我的数据有 67 列。有没有一种方法可以循环遍历所有列并自动创建每一列而无需输入所有列?我不想硬编码最多 67 个数组。

类似这样的东西,但它不起作用:

i=0
for d in data:
    "x%d"%i = data[:,i-1]
    i+=1

这是剩下的代码:

rpy.set_default_mode(rpy.NO_CONVERSION)
linear_model = rpy.r.lm(rpy.r("y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10"), data = rpy.r.data_frame(x1=x1,x2=x2,x3=x3,x4=x4,x5=x5,x6=x6,x7=x7,x8=x8,x9=x9,x10=x10,y=y))
rpy.set_default_mode(rpy.BASIC_CONVERSION)
print linear_model.as_py()['coefficients']
summary = rpy.r.summary(linear_model)

【问题讨论】:

  • 您期望的输出是什么?问题很难理解。
  • 我想自动创建 x1=data[:,1], x2=data[:,2].... 不必硬编码到 x67=data[:,67 ].
  • 当您的因变量y 被创建为y = x10 时,您确定要将x10 作为自变量包含吗?
  • 对不起,我没有澄清:Y 是我的最后一列,所以它会在 x67 之后。

标签: python arrays rpy2


【解决方案1】:

为什么不尝试这样的方法来转置列:

x = []

for d in xrange(0,66):
    x.append(data[:,d])

除非每个项目都有一个单独的数据结构是绝对必要的,虽然我不知道为什么你需要单独的数据结构......

编辑:如果不是这里的东西应该按照你描述的方式工作:

for d in xrange(1,68):
    exec 'x%s = data[:,%s]' %(d,d-1)

【讨论】:

    【解决方案2】:

    当你展示一点 rpy 代码时,我想我可以展示一下 rpy2 的样子。

    # build a DataFrame
    from rpy2.robjects.vectors import IntVector
    d = dict(('x%i' % (i+1), IntVector(data[:, i]) for i in range(68) if i != 9)
    d['y'] = data[:, 9]
    from rpy2.robjects.vectors import DataFrame
    dataf = DataFrame(d)
    del(d) # dictionary no longer needed
    
    # import R's stats package
    from rpy2.robjects.packages import importr
    stats = importr('stats')
    
    # fit model
    dep_var = 'y'
    formula = '%s ~ %s ' % (dep_var, '+'.join(x for x in dataf.names if x != dep_var))
    linear_model = stats.lm(formula, data = dataf) 
    

    【讨论】:

    • 这行得通。我的目标是获得最终结果中的系数。但是,我得到的许多(67 个)都是 NaN。我该如何解释?我的数据有问题吗?
    • 这是因为有些系数是不可估计的,可能是因为有些自变量是其他自变量的线性组合。在不了解确切数据集的情况下,我认为无论如何这看起来像很多自变量来拟合线性模型。你确定你需要所有这些吗?你试过变量选择吗?对于“交叉验证”的 stackexchange 站点来说,这越来越成为一个问题......
    • 那是有道理的。 NaN 变量不太重要。我注意到数据集越大,我收到的 NaN 系数就越少。我的目标是找出哪些变量最重要,所以我需要提供整个集合。我目前有拟合曲线 y = Ax1 + Bx2 + Cx3 的数据......我想一个不同的方程,比如逻辑可以更好地工作。我不确定。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多