Próbuję przetworzyć dane zapisane w CSV, które mogą mieć brakujące wartości w nieznanej liczbie kolumn (do około 30). Próbuję ustawić te brakujące wartości na "0", używając argumentu genfromtxt
's' filling_missing
. Oto przykład minimalny pracuje numpy 1.6.2 działa w ActiveState ActivePython 2.7 32 bit na Win 7.NumPy genfromtxt: używanie fill_missing poprawnie
import numpy
text = "a,b,c,d\n1,2,3,4\n5,,7,8"
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
b = open('test.txt','w')
b.write(text)
b.close()
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
print "plain",a
a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values=0)
print "filling_values=0",a
a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={1:0})
print "filling_values={1:0}",a
a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={0:0})
print "filling_values={0:0}",a
a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
print "filling_values={None:0}",a
a wynik:
plain [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values=0 [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values={1:0} [(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0)]
filling_values={0:0} [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
Traceback (most recent call last):
File "C:\Users\tolivo.EE\Documents\active\eng\python\sizer\testGenfromtxt.py", line 20, in <module>
a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
File "C:\Users\tolivo.EE\AppData\Roaming\Python\Python27\site-packages\numpy\lib\npyio.py", line 1451, in genfromtxt
filling_values[key] = val
TypeError: list indices must be integers, not NoneType
Z instrukcji NumPy spodziewałbym filling_values=0
i filling_values={None:0}
do pracy, ale zamiast tego tego nie robią i generują błąd odpowiednio. Kiedy podasz poprawną kolumnę (filling_values={1:0}
), to będzie działać, ale ponieważ mam dużą liczbę kolumn o nieznanej liczbie przed wyborem przez użytkownika, szukam sposobu, aby ustawić wypełnione wartości automatycznie, jak wskazówki w przewodniku użytkownika.
sobie wyobrazić prawdopodobnie mogę liczyć kolumny z góry i utworzyć dict do przekazania jako wartość do filling_values w międzyczasie, ale tam jest lepszy sposób?
Istnieje raport o błędzie: http://projects.scipy.org/numpy/ticket/1722 – Holger
Dzięki, dodałem komentarz do emisji na github bug trackera. https://github.com/numpy/numpy/issues/2317 – Thav
Błąd został poprawiony w wersji rozwojowej numpy: https://github.com/numpy/numpy/pull/4968 –