Ho riscontrato il seguente problema con NumPy 1.10.2 durante la lettura di un file CSV. Non riesco a capire come fornire tipi di dati espliciti a genfromtxt
.NumPy: disadattamento delle dimensioni del vecchio e nuovo descrittore di dati
Ecco il CSV, minimal.csv
:
x,y
1,hello
2,hello
3,jello
4,jelly
5,belly
Qui provo a leggerla con genfromtxt:
import numpy
numpy.genfromtxt('minimal.csv', dtype=(int, str))
Ho anche provato:
import numpy
numpy.genfromtxt('minimal.csv', names=True, dtype=(int, str))
In ogni caso, ho la errore:
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
In alternativa, ho provato:
import numpy
numpy.genfromtxt('minimal.csv', dtype=[('x', int), ('y', str)])
che getta:
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.
ho conosciuto dtype=None
rende NumPy per cercare di indovinare i tipi corretti e di solito funziona bene. Tuttavia, la documentazione menziona che è molto più lento di tipi espliciti. Nel mio caso è richiesta l'efficienza computazionale, quindi dtype=None
non è un'opzione.
C'è qualcosa di terribilmente sbagliato nel mio approccio o in NumPy?
Ho avuto un problema molto simile, che ho risolto dando il dtype come una lista invece di una tupla, e sembra lo stesso per il tuo caso. – pela