从文本输入数据作为数组

时间:2015-01-20 21:51:05

标签: python arrays text

大家好,

我有一个文本文件,其中包含以下格式的数据:

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,1,4,9,0,0,0,0,2,8,13,47,0,0,0,0,0,0,12,139,11,1,0,0,4,8,44,139,14,4,1,1,30,45,80,139,34,28,0,0,7,34,117,43,0,0,0,0,0,5,40,139,78,9,0,0,0,12,100,139,121,42,4,1,6,7,16,122,101,117,22,13,4,1,10,0,0,0,0,0,0,10,9,33,7,0,0,0,0,42,87,139,20,2,0,0,0,6,95,83,9,5,8,39,73,13,45]

这就是每一行都是128维的样本,同样,我的文本文件中有50k个样本。

我正在为上面给出的数据格式执行K-Means聚类。当我直接输入数据时,它在以下代码中完美地运行:

from sklearn.cluster import MiniBatchKMeans
import numpy

data = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,1,4,9,0,0,0,0,2,8,13,47,0,0,0,0,0,0,12,139,11,1,0,0,4,8,44,139,14,4,1,1,30,45,80,139,34,28,0,0,7,34,117,43,0,0,0,0,0,5,40,139,78,9,0,0,0,12,100,139,121,42,4,1,6,7,16,122,101,117,22,13,4,1,10,0,0,0,0,0,0,10,9,33,7,0,0,0,0,42,87,139,20,2,0,0,0,6,95,83,9,5,8,39,73,13,45]]   



mbkm = MiniBatchKMeans(init='k-means++', n_clusters=8, batch_size=100, n_init=10, max_no_improvement=10, verbose=0)
mbkm.fit(data)
mbk_means_cluster_centers = mbkm.cluster_centers_

numpy.set_printoptions(threshold=numpy.nan)
print mbk_means_cluster_centers

但是当我使用这段代码时

f = open("sample_input.txt", "r")
out = f.readlines()
for line in out:
    print line

要将文本文件中的内容读入数组格式,它会失败并且我收到错误"值错误:无法将字符串转换为浮动"。

我无法理解我哪里出错了。请建议我一个更好的方法来运行代码。提前致谢!

PS:我在ubuntu平台的python 2.7中编码。

4 个答案:

答案 0 :(得分:0)

我必须先说明将数据存储在文本文件中作为数组的代码表示是一个坏主意。如果可以,请以CSV或JSON等可序列化格式存储数据。

发生的事情是您正在阅读该行,并且它是字符串格式,而不是数组格式。当你遍历字符串(String仍然是一个可枚举的)时,它会得到每个字母,但是你的代码却抱怨无法使用该字符串,因为它需要浮点数。

如果真的需要以该格式读取该文件并且您信任该文件的来源,请尝试这样做。

f = open("sample_input.txt", "r") 
out = [eval(arr) for arr in f.readlines()]

请注意,这也将执行该文件中的代码,因此请确保您信任该文件的来源。

我的python体验是有限的,所以可能有一种更安全的方式来做到这一点。下次,使用CSV格式的文件进行数据处理。

答案 1 :(得分:0)

重申Moox的观点,使用csv来存储这些信息可能是个好主意。然后,您可以使用csv模块来解析文件。

避免评估也是一个好主意。你可以做这样的事情来解析当前格式的数据 -

def line_to_list_of_ints(line):
    # Split each line on commas and convert to an int
    return [int(item) for item in line.split(',')]

with open("sample_input.txt", "r") as f:
    lines = [line.strip() for line in f] # Remove new lines / whitespace
lines = [line[1:-1] for line in lines] # Remove square brackets from each end
lines = [line_to_list_of_ints(line) for line in lines] # Convert the line to a list of integers

如果您使用的是csv文件,可以将其简化为类似的内容 -

import csv

with open("sample_input.csv", "r") as f:
    reader = csv.reader(f)
    lines = []
    for line in reader:
        lines.append([int(item) for item in line])

答案 2 :(得分:0)

使用ast.literal_eval

如果文件中有一个数组:

from ast import  literal_eval

with open("sample_input.txt") as f:
   out = literal_eval(f.read())
   for line in out:
       print line

0
0
0
0
0
0
0
0
...............

对于多个阵列:

with open("in.txt") as f:
   for line in f:
       print literal_eval(line)

答案 3 :(得分:0)

假设您的数据位于mydata.txt ...

% sed '1idata=[ 
s/$/,/;$a]' < mydata.txt > mydata.py

创建一个可以在程序中导入的python模块

from mydata import data