Wystąpił następujący problem z NumPy 1.10.2 podczas odczytu pliku CSV. Nie mogę wymyślić, jak przekazać jawne typy danych do genfromtxt
.NumPy: niedopasowanie rozmiaru starego i nowego deskryptora danych
Oto CSV, minimal.csv
:
x,y
1,hello
2,hello
3,jello
4,jelly
5,belly
Tutaj staram się czytać z genfromtxt:
import numpy
numpy.genfromtxt('minimal.csv', dtype=(int, str))
Próbowałem również:
import numpy
numpy.genfromtxt('minimal.csv', names=True, dtype=(int, str))
W każdym razie, ja dostać błąd:
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
Alternatywnie, próbowałem:
import numpy
numpy.genfromtxt('minimal.csv', dtype=[('x', int), ('y', str)])
Która rzuca:
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.
mi wiadomo dtype=None
sprawia NumPy spróbować odgadnąć prawidłowe typy i zazwyczaj działa dobrze. Jednak dokumentacja wspomina, że jest znacznie wolniejsza niż typy jawne. W moim przypadku wymagana jest wydajność obliczeniowa, więc nie jest to opcja.
Czy jest coś nie w porządku z moim podejściem lub NumPy?
Miałem bardzo podobny problem, który rozwiązałem, podając dtype jako listę zamiast krotki i wydaje się, że to samo dotyczy przypadku. – pela