Hallo,
ich habe einen numpy-Array mit etwa 35.000 Werten, welche als Float64 vorliegen. Nun möchte ich bestimmte Werte innerhalb des Arrays austauschen/überschreiben, sofern eine gewisse Bedingung erfüllt ist.
Die Bedingung sieht folgendermaßen aus: Jeder Arraywert der größer als 1e8, also 100.000.000, ist, soll durch -9999 ersetzt werden. Der Wert -9999 sollen dann an diese Stelle im Array geschrieben werden.
Das ist doch bestimmt irgendwie machbar, oder? Ich habs mit if... else... probiert, das klappt aber nicht so gut.
Dankbar für Tipps und Lösungen.
in 1D-Array Wert x an Stelle y schreiben?
`put()` oder `putmask()` würden mir da spontan einfallen.
Code: Alles auswählen
In [101]: a = numpy.array([0.1, 2.0, 1.4, 3.5])
In [102]: a.putmask(-1, a >= 2)
In [103]: a
Out[103]: array([ 0.1, -1. , 1.4, -1. ])
In [104]: a = numpy.array([0.1, 2.0, 1.4, 3.5])
In [105]: a.put(-1, numpy.where(a >= 2))
In [106]: a
Out[106]: array([ 0.1, -1. , 1.4, -1. ])
Hoi,
glaube, was Dir gut tun würde ist ein Blick auf diese Seite:
http://www.scipy.org/Documentation
Dort findest Du u. a. auch viele Dokumente zu numpy: Eine freie, veraltete Doku, eine kostenpflichtige, neue Doku, viele Beispiele, etc. ...
Gruß,
Christian
glaube, was Dir gut tun würde ist ein Blick auf diese Seite:
http://www.scipy.org/Documentation
Dort findest Du u. a. auch viele Dokumente zu numpy: Eine freie, veraltete Doku, eine kostenpflichtige, neue Doku, viele Beispiele, etc. ...
Gruß,
Christian
Hi, ja habe Doku's hier und lese auch fleißig, Danke. Deine Tipps gehen in meinem Programm nicht, daher habe ich sie erstmal im Shell getestet - vergebens:BlackJack hat geschrieben:`put()` oder `putmask()` würden mir da spontan einfallen.
Code: Alles auswählen
In [101]: a = numpy.array([0.1, 2.0, 1.4, 3.5]) In [102]: a.putmask(-1, a >= 2) In [103]: a Out[103]: array([ 0.1, -1. , 1.4, -1. ]) In [104]: a = numpy.array([0.1, 2.0, 1.4, 3.5]) In [105]: a.put(-1, numpy.where(a >= 2)) In [106]: a Out[106]: array([ 0.1, -1. , 1.4, -1. ])
Code: Alles auswählen
>>> import numpy
>>> a = numpy.array([0.1, 2.0, 1.4, 3.5])
>>> a
array([ 0.1, 2. , 1.4, 3.5])
>>> a.putmask(-1, a >= 2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'numpy.ndarray' object has no attribute 'putmask'
>>> from numpy import putmask
>>> a.putmask(-1, a >= 2)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'numpy.ndarray' object has no attribute 'putmask'
>>> a
array([ 0.1, 2. , 1.4, 3.5])
>>> a.put(-1, numpy.where(a >=2))
>>> a
array([ 0.1, 2. , 1.4, 1. ])
>>> numpy.__version__
'1.0.2'
>>>
Python rockt.
Du hast eine neuere Version als ich:
Sollte die `putmask()`-Methode wirklich verschwunden sein und sich `put()` plötzlich anders verhalten? Irgendwas bei Deiner Installation ist sehr merkwürdig.
@CM: Welche `numpy`-Version benutzt Du denn, und gibt's bei Dir die Methoden (noch) und funktionieren sie wie bei mir?
Code: Alles auswählen
In [162]: numpy.__version__
Out[162]: '1.0rc1'
@CM: Welche `numpy`-Version benutzt Du denn, und gibt's bei Dir die Methoden (noch) und funktionieren sie wie bei mir?
Code: Alles auswählen
C:\>python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', 'c:\\Python24\\lib\\site-packages\\clearsilver-0.9.14-py2.4-win32.egg', 'c:
\\Python24\\lib\\site-packages\\setuptools-0.6c5-py2.4.egg', 'c:\\Python24\\lib\
\site-packages\\tracnav-3.92-py2.4.egg', 'c:\\Python24\\lib\\site-packages\\trac
pygments-0.3dev-py2.4.egg', 'c:\\Python24\\lib\\site-packages\\pygments-0.7.1-py
2.4.egg', 'c:\\Python24\\lib\\site-packages\\tracguestbook-0.2-py2.4.egg', 'c:\\
Python24\\lib\\site-packages\\tracpagetopdf-0.2-py2.4.egg', 'c:\\Python24\\lib\\
site-packages\\tracdiscussion-0.5-py2.4.egg', 'c:\\Python24\\lib\\site-packages\
\tracwebadmin-0.1.2dev_r4240-py2.4.egg', 'c:\\Python24\\lib\\site-packages\\scie
ntificpython-2.6-py2.4-win32.egg', 'c:\\Python24\\python24.zip', 'C:\\Documents
and Settings\\Praktikant.INTERN', 'c:\\Python24\\DLLs', 'c:\\Python24\\lib', 'c:
\\Python24\\lib\\plat-win', 'c:\\Python24\\lib\\lib-tk', 'c:\\Python24', 'c:\\Py
thon24\\lib\\site-packages']
>>>
Python rockt.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Nicht, wenn es ganz normal als Package unter /site-packages/ liegt.
Ja, tut es: C:\Python24\Lib\site-packages\numpybirkenfeld hat geschrieben:Nicht, wenn es ganz normal als Package unter /site-packages/ liegt.
Dort dann ne Menge Unterverzeichnisse wie core, numarray, oldnumeric, tests und einige Dateien.
Python rockt.
Version 1.0.1 . Funktioniert der Code bei Dir tatsächlich BJ? Oder hast Du kurz was durcheinandergewürfelt?
Was spricht gegen:?
Gruß,
Christian
Was spricht gegen:
Code: Alles auswählen
import numpy
a = numpy.array([0.1, 2.0, 1.4, 3.5])
numpy.putmask(a, a>=2, -1)
# oder (als Beispiel)
numpy.where(a == -1, 10, a)
Gruß,
Christian
Klar funktioniert das bei mir wirklich. Meine Beispiele sind 1:1 aus der ipython-Sitzung kopiert. Gibt's bei Dir die Methoden auch nicht?
Es gibt bei mod_che ja zumindest eine `put()`-Methode, die sich nicht über die Argumente beschwert, aber scheinbar nichts bewirkt.
Dazu kommt noch der Code im anderen Thread, der bei explizitem Setzen des `dtype` funktioniert, ohne aber nicht, obwohl das `array` den gleichen Typ hat. Das finde ich auch weiterhin sehr merkwürdig.
Es gibt bei mod_che ja zumindest eine `put()`-Methode, die sich nicht über die Argumente beschwert, aber scheinbar nichts bewirkt.
Dazu kommt noch der Code im anderen Thread, der bei explizitem Setzen des `dtype` funktioniert, ohne aber nicht, obwohl das `array` den gleichen Typ hat. Das finde ich auch weiterhin sehr merkwürdig.
Ich hab es jetzt kurzfristig so gelöst:
nicht schön, funktioniert aber. Melde mich morgen wieder und probiere dann Eure Beispiele aus.
Grüße
Code: Alles auswählen
for i in array123:
if array123[i] > 1e08:
array123[i] = -9999
print i, array123[i]
Grüße
Python rockt.
Doch, das schon, aber sie bewirkt eben nicht das, was ich suche.BlackJack hat geschrieben: Es gibt bei mod_che ja zumindest eine `put()`-Methode, die sich nicht über die Argumente beschwert, aber scheinbar nichts bewirkt.
Python rockt.
Dein Quelltext funktioniert nicht! Du benutzt die Werte als Index, das geht nicht gut.
Also ich glaube, BJ, Du hast da doch was durcheinandergewürfelt: putmask ist Teil von Numeric arrays und nicht numpy arrays, allerdings steht die Methode in numpy zur Verfügung.
Was aber geht ist:
Interessant in diesem Zusammenhang:
Einfach mal in numpy.ma reinschauen, da gibt es noch mehr Zeugs.
Gruß,
Christian
PS Für heute ab gleich offline und morgen die meiste Zeit nicht zu erreichen.
edit: Eine Nonsenszeile gelöscht
Was aber geht ist:
Code: Alles auswählen
import numpy
from numpy import putmask
a = numpy.array([0.1, 2.0, 1.4, 3.5])
mask = array([True,False,True,True])
putmask(a, [1, 0, 1, 0], mask)
Code: Alles auswählen
b = numpy.ma.masked_where(a > 2.0, a)
b.filled(fill_value=9999)
b.set_fill_value(0)
Gruß,
Christian
PS Für heute ab gleich offline und morgen die meiste Zeit nicht zu erreichen.
edit: Eine Nonsenszeile gelöscht
Zuletzt geändert von CM am Dienstag 15. Mai 2007, 20:15, insgesamt 2-mal geändert.
PPS Habe vor langer Zeit mal einen Wiki-Beitrag zu einem ähnlichen Thema geschrieben, ist allerdings ziemlich veraltet:
http://www.scipy.org/Cookbook/Matplotli ... ked_arrays
Gruß,
Christian
http://www.scipy.org/Cookbook/Matplotli ... ked_arrays
Gruß,
Christian
@CM: Bist Du da sicher? `Numeric` `array`\s haben bei mir weder `put()` noch `putmask()`, bei `numarray` gibt's nur ein `put()` was aber anscheinend andere Argumente erwartet als die Funktionen im Modul und bei `numpy` habe ich beide Methoden auf den `array`\s und beide funktionieren auch.
OKOK, dann eher so?BlackJack hat geschrieben:Dein Quelltext funktioniert nicht! Du benutzt die Werte als Index, das geht nicht gut.
Code: Alles auswählen
for i in range(len(array123)):
if array123[i] > 1e08:
array123[i] = -9999
print i, array123[i]
Code: Alles auswählen
>>> a = numpy.array([1., 2., 3., 4.])
>>> a
array([ 1., 2., 3., 4.])
>>> for i in range(len(a)):
... if a[i] > 2:
... a[i] = -9999
...
>>> a
array([ 1.00000000e+00, 2.00000000e+00, -9.99900000e+03,
-9.99900000e+03])
>>>
Python rockt.