Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从txt文件创建数组_Python_Arrays_Text - Fatal编程技术网

Python 从txt文件创建数组

Python 从txt文件创建数组,python,arrays,text,Python,Arrays,Text,我是python新手,有个问题。 我有一些测量数据保存在txt文件中。 数据由选项卡分隔,具有以下结构: 0 0 -11.007001 -14.222319 2.336769 我每次模拟总是有32个数据点(0,1,2,…,31),我有300个模拟(0,1,2…,299),所以数据首先按照模拟的数量排序,然后再按照数据点的数量排序 第一列是模拟编号,第二列是数据点编号,其他三列是x、y、z坐标 我想创建一个3d数组,第一个维度应该是模拟编号,第二个维度是数据点编号,第三个维度是三个坐

我是python新手,有个问题。 我有一些测量数据保存在txt文件中。 数据由选项卡分隔,具有以下结构:

0   0   -11.007001  -14.222319  2.336769
我每次模拟总是有32个数据点(0,1,2,…,31),我有300个模拟(0,1,2…,299),所以数据首先按照模拟的数量排序,然后再按照数据点的数量排序

第一列是模拟编号,第二列是数据点编号,其他三列是x、y、z坐标

我想创建一个3d数组,第一个维度应该是模拟编号,第二个维度是数据点编号,第三个维度是三个坐标

我已经开始了一点,以下是我到目前为止所做的:

## read file
coords = [x.split('\t') for x in
          open(f,'r').read().replace('\r','')[:-1].split('\n')]
## extract the information you want
simnum = [int(x[0]) for x in coords]
npts = [int(x[1]) for x in coords]
xyz = array([map(float,x[2:]) for x in coords])
但我不知道如何将这两个列表和这一个数组组合起来

最后,我希望有这样的东西:

数组=[simnum][num\u dat\u point][xyz]

谢谢你的帮助

我希望你们理解我的问题,这是我在python论坛上的第一篇帖子,所以如果我做错了什么,我对此表示抱歉

再次感谢

您可以将它们与以下内容结合使用:

for sim, datapoint, x, y, z in zip(simnum, npts, *xyz):
    # do your thing
或者,您可以完全避免列表理解,只需迭代文件的行:

for line in open(fname):
    lst = line.split('\t')
    sim, datapoint = int(lst[0]), int(lst[1])
    x, y, z = [float(i) for i in lst[2:]]
    # do your thing
要分析一行,您可以(并且应该)执行以下操作:

coords = [x.split('\t') for x in open(fname)]

根据python的zen,扁平比嵌套好。我就用听写器

import csv
f = csv.reader(open('thefile.csv'), delimiter='\t',
               quoting=csv.QUOTE_NONNUMERIC)

result = {}
for simn, dpoint, c1, c2, c3 in f:
    result[simn, dpoint] = c1, c2, c3

# pretty-prints the result:
from pprint import pprint
pprint(result)

这似乎是一个使用itertools.groupby的好机会

import itertools
import csv
file = open("data.txt")
reader = csv.reader(file, delimiter='\t')
result = []
for simnumberStr, rows in itertools.groupby(reader, key=lambda t: t[0]):
    simData = []
    for row in rows:
        simData.append([float(v) for v in row[2:]])
    result.append(simData)
file.close()
这将创建一个名为“结果”的三维列表。第一个索引是仿真编号,第二个索引是该仿真中的数据索引。该值是包含x、y和z坐标的整数列表


请注意,这假设数据已按模拟编号和数据编号进行排序。

本质上,困难在于如果不同的模拟具有不同的点数,会发生什么情况

因此,首先需要将数组尺寸标注为适当的大小。 t应该是一个至少包含
max(simnum)x max(npts)x 3
的数组。 为了消除混淆,您应该使用not-a-number初始化, 这将允许您查看缺失的点

然后使用类似

for x in coords:
  t[int(x[0])][int(x[1])][0]=float(x[3])
  t[int(x[0])][int(x[1])][1]=float(x[4])
  t[int(x[0])][int(x[1])][2]=float(x[5])

这就是你的意思吗?

首先,我要指出,你的第一个数据点似乎是一个索引,不知道这些数据是否因此重要,但以哪一个为准:-)

最终数据应具有以下输出:

[(0, 0, [-11.007001000000001, -14.222319000000001, 2.3367689999999999]),
 (1, 0, [-11.007001000000001, -14.222319000000001, 2.3367689999999999]),
 (2, 0, [-11.007001000000001, -14.222319000000001, 2.3367689999999999]),
 (3, 0, [-11.007001000000001, -14.222319000000001, 2.3367689999999999]),
 (4, 0, [-11.007001000000001, -14.222319000000001, 2.3367689999999999])]
这对于处理空白问题(制表符、空格等等)应该是非常有效的


我还想知道你的数据文件有多大,而我的数据文件通常都很大,所以能够以块或组的形式处理它们变得更加重要。。。无论如何,这将在python 2.6中起作用。

您可以使用多种不同类型的容器,但是没有一种容器将
array
作为非限定名称——python有一个模块
array
,您可以从标准库导入,但是
array.array
类型对于您的目的来说太有限了(仅1-D,内容为基本类型);有一个流行的第三方扩展名为
numpy
,它确实有一个强大的
numpy.array
类型,如果您下载并安装了该扩展,就可以使用该类型,但您从未提到过
numpy
,我怀疑您的意思是什么;相关的内置类型是
list
dict
。我假设你想要任何容器——但如果你将来能学会使用精确的术语,这将极大地帮助你和任何试图帮助你的人(当你指列表时说列表,仅当你指数组时说数组,当你不确定要用什么容器时说容器等等)

我建议您查看标准库中的
csv
模块,以获得更可靠的数据读取方法,但这是一个单独的问题。让我们从
coords
列表开始,每个列表包含5个字符串,每个子列表包含代表两个整数的字符串,后跟三个浮点。还需要说明另外两个关键方面证实

你没有告诉我们的一个关键方面是:列表是否以某种重要的方式排序?特别是,你是否希望保持某种重要的顺序?因为你甚至没有提到这两个问题,我将不得不以某种方式假设,我将假设没有任何保证或有意义的顺序;但是,不要重复(每对模拟/数据点编号不允许出现一次以上)

第二个关键方面:每个模拟是否有相同数量的数据点,以递增的顺序(0,1,2,…),还是不一定如此(顺便说一句,模拟本身是否编号为0,1,2,…)?同样,你对规范中这一不可或缺的部分没有任何线索——请注意,你只是不告诉我们这些明显至关重要的方面,就迫使潜在的帮助者做出了多少假设。不要让想要帮助你的人在黑暗中绊倒:相反,要学会——这将为你自己和潜在的帮助者节省数不清的时间为您提供了更高质量和更相关的帮助,那么,为什么不这样做呢?无论如何,被迫做另一个假设,我必须假设对模拟数字和每个模拟中的数据点数字一无所知

根据这些假设,
dict
成为用于外部容器的唯一合理结构:一个字典,其键是一个包含两个项的元组,模拟数然后是模拟内的数据点数。值也可能是元组(每个值有三个浮点数),因为看起来每行正好有3个坐标

基于所有这些假设…:

def make_container(coords):
  result = dict()
  for s, d, x, y, z in coords:
    key = int(s), int(d)
    value = float(x), float(y), float(z)
    result[key] = value
  return result
def
语句中包含所有重要的代码总是最好的,也是最快的(即作为要调用的函数,可能带有适当的参数),因此我以这种方式介绍它
def make_container(coords):
  result = dict()
  for s, d, x, y, z in coords:
    key = int(s), int(d)
    value = float(x), float(y), float(z)
    result[key] = value
  return result
d = make_container(coords)
print d[0, 0]
print d.get((0, 0))
data = []
for coord in coords:
    if coord[0] not in data:
        data[coord[0]] = []
    data[coord[0]][coord[1]] = (coord[2], coord[3], coord[4])