2016-04-12 15 views
0

olarak boş satırlarla ayrılmış txt verilerini okuma: şöyle bir txt dosyasında bazı veriler var birkaç numpy diziler

# Contour 0, label:  37 
41.6 7.5 
41.5 7.4 
41.5 7.3 
41.4 7.2 

# Contour 1, label: 
48.3 2.9 
48.4 3.0 
48.6 3.1 

# Contour 2, label: 
61.4 2.9 
61.3 3.0 
.... 

Böylece her blok bir açıklama ile başlar ve boş satır ile sona erer. O verileri okumak ve numpy diziler oluşan bir liste haline getirmek istiyorum , Numpy ile bunu etkili bir yolu var mı

# list as i want it: 
[array([[41.6, 7.5], [41.5, 7.4], [1.5, 7.3], [41.4, 7.2]]), 
array([[48.3, 2.9], [48.4, 3.0], [48.6, 3.1]]), 
array([[61.4, 2.9], [61.3, 3.0]]), ...] 

gibi pek? genfromtxt veya loadtxt gerekli seçeneklere sahip değil gibi görünüyor !?

+0

'loadtxt' ve' genfromtxt' şu şekildedir:

from itertools import groupby import numpy as np array_list = [] with open('data.txt') as f_data: for k, g in groupby(f_data, lambda x: x.startswith('#')): if not k: array_list.append(np.array([[float(x) for x in d.split()] for d in g if len(d.strip())])) for entry in array_list: print entry print 

Bu array_list görüntüleyecektir özellikle verimli değildir. Sadece giriş satırını satırdan okuyorlar, bir 'split' yapıyorlar ve değerleri bir listede toplarlar. 'dönüşüm bir son. Basit şamandıralar için kendi okuyucunuz aynı derecede iyi olacaktır. – hpaulj

+0

Bloklarla csv okuma hakkında daha önceki SO soruları vardır. Okuyucular herhangi bir kaynaktan gelen çizgileri kabul eder. Kendi filtrenizi veya jeneratörünüzü yazın. – hpaulj

cevap

1

3 girişleri birlikte gruba Python'un groupby işlevini kullanabilirsiniz:

[[ 41.6 7.5] 
[ 41.5 7.4] 
[ 41.5 7.3] 
[ 41.4 7.2]] 

[[ 48.3 2.9] 
[ 48.4 3. ] 
[ 48.6 3.1]] 

[[ 61.4 2.9] 
[ 61.3 3. ]] 
+0

Neden ve nasıl çalıştığını anlamak için biraz zamana ihtiyacım vardı. Vay, teşekkürler! – Geri

0

Bunu beğendiniz mi? aşağıdaki gibi

import numpy as np 

text = \ 
''' 
# Contour 0, label:  37 
41.6 7.5 
41.5 7.4 
41.5 7.3 
41.4 7.2 

# Contour 1, label: 
48.3 2.9 
48.4 3.0 
48.6 3.1 

# Contour 2, label: 
61.4 2.9 
61.3 3.0 
''' 
for line in text.split('\n'): 
    if line != '' and not line.startswith('#'): 
     data = line.strip().split() 
     array = np.array([float(d) for d in data]) 
     print(array) 
İlgili konular