【问题标题】:Python nested loop - table index as variablePython嵌套循环 - 表索引作为变量
【发布时间】:2018-06-21 05:48:07
【问题描述】:

我不是 Python 程序员,但我需要使用 SciPy 库中的一些方法。我只想重复几次内部循环,但改变了表的索引。这是我现在的代码:

from scipy.stats import pearsonr

fileName = open('ILPDataset.txt', 'r')
attributeValue, classValue = [], []

for index in range(0, 10, 1):
    for line in fileName.readlines():
        data = line.split(',')
        attributeValue.append(float(data[index]))
        classValue.append(float(data[10]))
    print(index)
    print(pearsonr(attributeValue, classValue))

我得到以下输出:

0
(-0.13735062681256097, 0.0008840631556260505)
1
(-0.13735062681256097, 0.0008840631556260505)
2
(-0.13735062681256097, 0.0008840631556260505)
3
(-0.13735062681256097, 0.0008840631556260505)
4
(-0.13735062681256097, 0.0008840631556260505)
5
(-0.13735062681256097, 0.0008840631556260505)
6
(-0.13735062681256097, 0.0008840631556260505)
7
(-0.13735062681256097, 0.0008840631556260505)
8
(-0.13735062681256097, 0.0008840631556260505)
9
(-0.13735062681256097, 0.0008840631556260505)

如您所见,索引正在发生变化,但该函数的结果始终就像索引为 0。

当我多次运行脚本但索引值发生变化时:

attributeValue.append(float(data[0]))
attributeValue.append(float(data[1]))
...
attributeValue.append(float(data[9]))

一切正常,我得到了正确的结果,但我不能在一个循环语句中做到这一点。我做错了什么?

编辑: 测试文件:

62,1,6.8,3,542,116,66,6.4,3.1,0.9,1
40,1,1.9,1,231,16,55,4.3,1.6,0.6,1
63,1,0.9,0.2,194,52,45,6,3.9,1.85,2
34,1,4.1,2,289,875,731,5,2.7,1.1,1
34,1,4.1,2,289,875,731,5,2.7,1.1,1
34,1,6.2,3,240,1680,850,7.2,4,1.2,1
20,1,1.1,0.5,128,20,30,3.9,1.9,0.95,2
84,0,0.7,0.2,188,13,21,6,3.2,1.1,2
57,1,4,1.9,190,45,111,5.2,1.5,0.4,1
52,1,0.9,0.2,156,35,44,4.9,2.9,1.4,1
57,1,1,0.3,187,19,23,5.2,2.9,1.2,2
38,0,2.6,1.2,410,59,57,5.6,3,0.8,2
38,0,2.6,1.2,410,59,57,5.6,3,0.8,2
30,1,1.3,0.4,482,102,80,6.9,3.3,0.9,1
17,0,0.7,0.2,145,18,36,7.2,3.9,1.18,2
46,0,14.2,7.8,374,38,77,4.3,2,0.8,1

pearsonr 运行 9 次脚本的预期结果:

data[0] (0.06050513030608389, 0.8238536636813034)
data[1] (-0.49265895172303803, 0.052525691067199995)
data[2] (-0.5073312383613632, 0.0448647312201305)
data[3] (-0.4852842899321005, 0.056723468068371544)
data[4] (-0.2919584357031029, 0.27254138535817224)
data[5] (-0.41640591455640696, 0.10863082761524119)
data[6] (-0.46954072465442487, 0.0665061785375443)
data[7] (0.08874739193909209, 0.7437895010751641)
data[8] (0.3104260624799073, 0.24193152445774302)
data[9] (0.2943030868699842, 0.26853066217221616)

【问题讨论】:

  • 通过缩进将 print(index)print(pearsonr(attributeValue, classValue)) 放入第二个 for 循环中
  • 但是我不能在每个内部循环迭代中调用 pearsonr 方法。我想先填写这些表,然后调用这个方法。它应该被调用 10 次。
  • 您能否在ILPDataset.txt 中添加一行以更好地理解您的问题
  • 65,0,0.7,0.1,187,16,18,6.8,3.3,0.9,1
  • 您能否提供几行文件以及attributeValue 的预期结果?

标签: python loops indexing scipy pearson


【解决方案1】:

将文件的每一行变成浮点数列表

data = []
with open'ILPDataset.txt') as fileName:
    for line in fileName:
        line = line.strip()
        line = line.split(',')
        line = [float(item) for item in line[:11]]
        data.append(line)

转置数据,以便 data 中的每个列表都具有来自原始文件的列值。 data --> [[column 0 items], [column 1 items],[column 2 items],...]

data = zip(*data)    # for Python 2.7x
#data = list(zip(*data))    # for python 3.x

相关:

for n in [0,1,2,3,4,5,6,7,8,9]:
    corr = pearsonr(data[n], data[10])
    print('data[{}], {}'.format(n, corr))

【讨论】:

  • 完美解决方案,按预期工作。太感谢了!。 :)
  • @KrzysiekZienkiewicz - 随时accept the answer
  • 我已经接受了,但似乎我不得不意外撤消接受。现在应该没问题了:)
【解决方案2】:

@wwii 的回答很好

只有一个建议。 list(zip(*data)) 对我来说似乎有点矫枉过正。 zip 实际上是用于将具有可变类型和潜在可变长度的列表组合成元组。只有在这种情况下使用 list()) 才能将其转换回列表。

那么为什么不直接使用简单的transpose 操作呢?

import numpy;

//...

data = numpy.transpose(data);

它做同样的工作,可能更快(不是测量)并且更具确定性。

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 2015-02-14
    • 1970-01-01
    • 2017-08-13
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多