python - 在二维数组中排列不同数量的 float

标签 python arrays

首先,我是Python的新手,所以如果我只见树木不见森林,请原谅我。我的问题是读取一个巨大的 float 文件并将它们存储在数组中以进行快速数学后处理。

让我们假设该文件看起来与此类似:

!!
    -3.2297390   0.4474691   3.5690145   3.5976372   6.9002712   7.7787466  14.2159269  14.3291490
    16.7660723  17.1258704  18.9469059  19.1716808  20.0700721  21.4088414
    -3.2045361   0.4123081   3.5625981   3.5936954   6.8901539   7.7543415  14.2764611  14.3623976
    16.7955934  17.1560337  18.9527369  19.1251184  20.0700709  21.3515145
    -3.2317597   0.4494166   3.5799182   3.6005429   6.8838705   7.7661897  14.2576455  14.3295731
    16.7550357  17.0986678  19.0187779  19.1687722  20.0288587  21.3818250
    -3.1921346   0.3949598   3.5636878   3.5892085   6.8833690   7.7404542  14.3061281  14.3855389
    16.8063645  17.1697110  18.9549920  19.1134580  20.0613223  21.3196066

这里有 4 (nb) 个 block ,每个 block 有 14 (nk) 个 float 。我希望它们排列在数组 elements[nb][nk] 中,以便我可以轻松地循环访问 block 的某些 float 。

我认为它应该是这样的,但它根本不起作用:

nb=4
nk=14

with open("datafile") as file:
    elements = []
    n = 0    
    while '!!' not in file: 
            while n <= (nb-1):
            elements.append([])
            current = map(float,file.read().split())  # here I would need something to assure only 14 (nk) floats are read in
            elements[n].append(current)
            n += 1

print(elements[0][1])

如果有一些想法和建议,那就太好了。谢谢!

编辑:

这里是一个数据文件,其中数字紧随其后, block nb 之后没有明确的分隔符。这里nb=2,nk=160。如何在每个第 160 个数字之后将读取拆分为 float ?

!!
 -7.2578105433   -7.2578105433   -6.7774609392   -6.7774609392   -6.3343986693   -6.3343986693   -5.8537216826   -5.8537216826
 -5.6031029888   -5.6031029888   -2.9103190893   -2.9103190893   -1.7962279174   -1.7962279174   -0.8136720023   -0.8136720023
 -0.1418500769   -0.1418500769    2.9923464558    2.9923464558    3.5797768050    3.5797768050    3.8793240270    3.8793240270
  4.0774192689    4.0774192689    4.2378755781    4.2378755781    4.2707165126    4.2707165126    4.3290523910    4.3290523910
  4.4487102661    4.4487102661    4.5341883539    4.5341883539    4.7946098470    4.7946098470    4.9518205998    4.9518205998
  4.9592549825    4.9592549825    5.1648268937    5.1648268937    5.2372127454    5.2372127454    5.9377062691    5.9377062691
  6.2971992823    6.2971992823    6.6324702419    6.6324702419    6.7948808733    6.7948808733    7.0835270703    7.0835270703
  7.6252686579    7.6252686579    7.7886279100    7.7886279100    7.8514022664    7.8514022664    7.9188180854    7.9188180854
  7.9661386138    7.9661386138    8.2830991934    8.2830991934    8.4581462733    8.4581462733    8.5537201519    8.5537201519
 10.2738010533   10.2738010533   11.4495306517   11.4495306517   11.4819579346   11.4819579346   11.5788238984   11.5788238984
 11.9411469341   11.9411469341   12.5006172267   12.5006172267   12.5055546075   12.5055546075   12.6659410418   12.6659410418
 12.8741094000   12.8741094000   12.9560279595   12.9560279595   12.9780521671   12.9780521671   13.2195973082   13.2195973082
 13.2339969658   13.2339969658   13.3594047155   13.3594047155   13.4530024795   13.4530024795   13.4556342387   13.4556342387
 13.5784994631   13.5784994631   14.6887369915   14.6887369915   14.9019726334   14.9019726334   15.1279383300   15.1279383300
 15.1953349879   15.1953349879   15.3209538297   15.3209538297   15.4042612992   15.4042612992   15.4528348692   15.4528348692
 15.4542742538   15.4542742538   15.5291462589   15.5291462589   15.5415591416   15.5415591416   16.0741610117   16.0741610117
 16.1117432607   16.1117432607   16.3566675522   16.3566675522   17.7569123657   17.7569123657   18.4416346230   18.4416346230
 18.9525843134   18.9525843134   19.0591624486   19.0591624486   19.1069867477   19.1069867477   19.1853525353   19.1853525353
 19.4020021909   19.4020021909   19.4718240723   19.4718240723   19.6384650104   19.6384650104   19.6919638323   19.6919638323
 19.7044699790   19.7044699790   19.8851141335   19.8851141335   20.6132283388   20.6132283388   21.4074471478   21.4074471478
 -7.2568288331   -7.2568280628   -6.7765483088   -6.7765429702   -6.3336003082   -6.3334841531   -5.8529872639   -5.8528369047
 -5.6024822566   -5.6024743589   -2.9101060346   -2.9100930470   -1.7964872791   -1.7959333994   -0.8153333579   -0.8144924713
 -0.1440078470   -0.1421444935    2.9869228390    2.9935342026    3.5661875018    3.5733148387    3.8777649741    3.8828300867
  4.0569348321    4.0745074351    4.2152251981    4.2276050415    4.2620483420    4.2649182323    4.3401804124    4.3402590222
  4.4446178512    4.4509411587    4.5139270348    4.5526439516    4.7788285567    4.7810706248    4.9282976775    4.9397807768
  4.9737752749    4.9900180286    5.1456209436    5.1507667583    5.2528363215    5.2835144984    5.9252188817    5.9670441193
  6.2699491148    6.3270140700    6.5912060019    6.6576016532    6.7976670773    6.7982056614    7.0789050974    7.1023337244
  7.6182108739    7.6309688587    7.7678148773    7.7874194913    7.8544608005    7.8594983757    7.9019395451    7.9100447766
  7.9872550937    7.9902791771    8.2617740182    8.3147140843    8.4533756827    8.4672364683    8.5556163680    8.5558640539
 10.2756173692   10.2760227976   11.4344757209   11.4355375519   11.4737803653   11.4760186102   11.5914333288   11.5953932241
 11.9369518613   11.9380900159   12.4973099542   12.5002401499   12.5030167542   12.5031963862   12.6629548222   12.6634150863
 12.8719844312   12.8728126622   12.9541436501   12.9568445777   12.9762780998   12.9764840239   13.2074024551   13.2108294169
 13.2279146175   13.2308902307   13.3780648962   13.3839050348   13.4634576072   13.4650575047   13.4701414823   13.4718238883
 13.5901622459   13.5971076111   14.6735704782   14.6840793519   14.8963924604   14.8968395615   15.1163287408   15.1219631271
 15.1791724308   15.1817299995   15.2628531102   15.3027136606   15.3755066968   15.3802521520   15.3969012144   15.4139294088
 15.5131322524   15.5315039463   15.5465532500   15.5629105034   15.5927166831   15.5966393750   16.0841067052   16.0883417123
 16.1224821534   16.1226510159   16.3646268213   16.3665839987   17.7654543366   17.7657216551   18.4305335335   18.4342292730
 18.9110142692   18.9215889808   18.9821593138   18.9838270736   19.1633959849   19.1637558341   19.2040877093   19.2056062802
 19.3760597529   19.3846323861   19.4323552578   19.4329488797   19.6494790293   19.6813374885   19.6943820824   19.7202356536
 19.7381237231   19.7414645409   19.9056461663   19.9197428869   20.6239183178   20.6285756411   21.4127637743   21.4128909767

最佳答案

这应该有效:

elements = []
with open("datafile") as file:
    next(file)
    for line in file:
        elements.append([float(x) for x in line.split()])

next(line) 读取第一行。然后 for line in file: 迭代所有其他行。列表理解 [float(x) for x in line.split()] 遍历行中由空格分隔的所有条目。最后,elements.append() 将此列表附加到 elements,该列表成为可称为二维数组的列表列表。

访问第一行中的第一个条目:

>>> elements[0][0]
-3.229739

或者最后一行的最后一个条目:

>>> elements[3][13]
21.319606

或者:

>>> elements[-1][-1]
21.319606

更新

这会将文件读取到列表列表中,而不将换行符视为特殊:

nb = 2
nk = 160

with open("datafile") as fobj:
    all_values = iter(x for x in fobj.read().split())
    next(all_values)
    elements = []
    for x in range(nb):
        elements.append([float(next(all_values)) for counter in range(nk)])

如果您喜欢嵌套列表推导式:

with open("datafile") as fobj:
    all_values = iter(x for x in fobj.read().split())
    next(all_values)
    elements = [[float(next(all_values)) for counter in range(nk)] for x in range(nb)]

关于python - 在二维数组中排列不同数量的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33981578/

相关文章:

javascript - 无法使用我的数组项通过 JQuery 预填充我的表单输入

python - 如何使用 matplotlib 从 numpy 列表中绘制多个数据集

c++ - 如何在 C++ 中打印二维数组?

javascript - Python 网络抓取 - 从哪里开始

python - 为什么 sklearn 线性回归对通过 (0,0) 的直线给出非零截距?

python - 使用 python 转换 Mac 时间戳

python - 如何使用 Python 将使用 Google App Engine Launcher 在本地主机上制作的记录导入到在线 App Engine 数据存储区?

arrays - 如何绘制数组的实部和虚部?

jquery - Foreach Ajax Json - Jquery

python - Openerp Webkit 报告给出 OsError