簡體   English   中英

從文本輸入數據作為數組

[英]Inputting data from text as array

大家好,

我有一個文本文件,其數據格式如下:

[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維的樣本,同樣,整個文本文件中有5萬個樣本。

我正在為上述給定的數據格式執行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進行編碼。

首先,我必須說,將數據存儲在文本文件中作為數組的代碼表示是一個壞主意。 如果可以,請以可序列化的格式(如CSV或JSON)存儲數據。

發生的情況是您正在讀取該行,並且它是字符串格式,而不是數組格式。 當您遍歷字符串時(字符串仍然是可枚舉的),它會獲取每個字母,但是您的代碼隨后抱怨無法使用該字符串,因為它需要浮點數。

如果您確實需要以該格式讀取該文件並且您信任文件的來源,請嘗試執行此操作。

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

請注意,這還將在該文件中執行代碼,因此請確保您信任文件的來源。

我的python經驗有限,因此可能會有更安全的方法。 下次,使用CSV格式的文件存儲數據。

重申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])

使用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)

說您的數據在mydata.txt ...

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

創建一個可以在程序中導入的python模塊

from mydata import data

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM