2015-12-15 11 views
6

Bir CSV dosyası okurken NumPy 1.10.2 ile aşağıdaki problemi yaşadım. genfromtxt'a açık veri türleri nasıl verileceğini anlayamıyorum. Ben olsun,NumPy: eski ve yeni veri tanımlayıcısının boyutunda uyumsuzluk

import numpy 
numpy.genfromtxt('minimal.csv', names=True, dtype=(int, str)) 

neyse: Ben de denedim

import numpy 
numpy.genfromtxt('minimal.csv', dtype=(int, str)) 

:

İşte
x,y 
1,hello 
2,hello 
3,jello 
4,jelly 
5,belly 

Ben genfromtxt ile okumaya çalışacak: Burada

CSV minimal.csv olduğunu hata:

Traceback (most recent call last): 
    File "visualize_numpy.py", line 39, in <module> 
    numpy.genfromtxt('minimal.csv', dtype=(int, str)) 
    File "/Users/xeli/workspace/myproj/env/lib/python3.5/site-packages/numpy/lib/npyio.py", line 1518, in genfromtxt 
    replace_space=replace_space) 
    File "/Users/xeli/workspace/myproj/env/lib/python3.5/site-packages/numpy/lib/_iotools.py", line 881, in easy_dtype 
    ndtype = np.dtype(ndtype) 
ValueError: mismatch in size of old and new data-descriptor 

Alternatif Denedim:

import numpy 
numpy.genfromtxt('minimal.csv', dtype=[('x', int), ('y', str)]) 

atar Hangi:

Tanıdığım
Traceback (most recent call last): 
    File "visualize_numpy.py", line 39, in <module> 
    numpy.genfromtxt('minimal.csv', dtype=[('x', int), ('y', str)]) 
    File "/Users/xeli/workspace/myproj/env/lib/python3.5/site-packages/numpy/lib/npyio.py", line 1834, in genfromtxt 
    rows = np.array(data, dtype=[('', _) for _ in dtype_flat]) 
ValueError: size of tuple must match number of fields. 

dtype=None NumPy doğru türlerini tahmin etmeye çalışır ve genellikle iyi çalışır hale getirir. Bununla birlikte, belgede bunun açık türlerden çok daha yavaş olduğu belirtilmektedir. Benim durumumda hesaplama verimliliği gereklidir, bu nedenle dtype=None bir seçenek değildir.

Yaklaşımım veya NumPy'mle ilgili yanlış bir şey mi var?

+1

Ben bir liste yerine bir demet olarak d_type vererek çözüldü çok benzer bir sorunu vardı ve aynı dava için de geçerlidir görünüyor. – pela

cevap

3

deneyin:

df = numpy.genfromtxt('minimal.csv', 
         names=True, 
         dtype=None, 
         delimiter=',') 

Bu genfromtxt genellikle ne istiyorsun d_type tahmin yapar. Delimiter bir virgül, bu yüzden bu argümanı da geçmeliyiz ve sonunda names=True başlık bilgisini korur.

>>>>print(df['x']) 
[1 2 3 4 5] 

Düzenleme:: aşağıya comment göre, bunu gibi açıkça d_type sağlayabilir:

df = numpy.genfromtxt('file1.csv', 
         names=True, 
         dtype=[('x', int), ('y', 'S5')], # assuming each string is of len =< 5 
         delimiter=',') 
+0

Teşekkürler! Ve üzgünüm, ne yazık ki 'dtype = None' yavaşlığından dolayı benim durumumda uygun değil. Bunu soruya ekledim. Türleri genfromtxt'e açıkça nasıl vereceğimi anlayamıyorum. –

+0

@ AkseliPalén, güncellenmiş yanıtıma bakın! Umarım bu yardımcı olur :) –

0

Kısaca documentation numaralı telefondan varsayılan delimiter=None.

Bu iyi çalışıyor, ve başlık bilgilerinizi korur numpy.genfromtxt('minimal.csv', dtype=(int, str), names=True, delimiter=',')

+0

'' names = True' 'sütunlarını ilk satırdan okumak için – MaxNoe

+0

@MaxNoe hatamı kullanabilirsiniz. Yani sınırlayıcı alan o zaman önemli değil. – pushkin

+0

'names = True', skip_header' yerine geçer. Hala 'sınırlayıcı =', ''ve' dtype = None' 'a ihtiyacınız var. – hpaulj

0

ben

Basitçe herhangi çerçeve ile yaptığınız gibi verilere erişmek Sağladığım türlerimin neden hata yaptığını bilmediğim aynı konumdayım. Bu, sizin için uygulanabilir bir çözüm olabilir dedi. Veri kümemi kullanarak, sizinkiyle benzer görünen bir örnek.

>>> movies = np.genfromtxt('movies.csv', delimiter='|', dtype=None) 
>>> movies 
array([(1, 'Toy Story (1995)'), (2, 'GoldenEye (1995)'), 
     (3, 'Four Rooms (1995)'), ..., (1680, 'Sliding Doors (1998)'), 
     (1681, 'You So Crazy (1994)'), 
     (1682, 'Scream of Stone (Schrei aus Stein) (1991)')], 
     dtype=[('f0', '<i8'), ('f1', 'S81')]) 

Sonra algılanan türlerini kullanarak tüm verileri yüklemek:

>>> movies = np.genfromtxt('movies.csv', delimiter='|', 
          dtype=[('f0', '<i8'), ('f1', 'S81')]) 

Bu kuşkusuz kadar tatmin edici değil

Birincisi, NumPy kullanan gerçek dtypes bazı verilerin yüklenmesi ve denetlemek NumPy'nin neden hata yaptığını bilmek, ancak özel kullanım durumunuz için çalışır.