Seite 1 von 1
in 1D-Array Wert x an Stelle y schreiben?
Verfasst: Dienstag 15. Mai 2007, 16:12
von mod_che
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.
Verfasst: Dienstag 15. Mai 2007, 16:32
von BlackJack
`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. ])
Verfasst: Dienstag 15. Mai 2007, 16:41
von CM
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
Verfasst: Dienstag 15. Mai 2007, 16:55
von mod_che
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. ])
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:
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'
>>>
Verfasst: Dienstag 15. Mai 2007, 17:16
von BlackJack
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?
Verfasst: Dienstag 15. Mai 2007, 17:26
von mod_che
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']
>>>
Hilft das? Sollte hier nicht auch numpy bei mir auftauchen?
Verfasst: Dienstag 15. Mai 2007, 17:27
von birkenfeld
Nicht, wenn es ganz normal als Package unter /site-packages/ liegt.
Verfasst: Dienstag 15. Mai 2007, 17:38
von mod_che
birkenfeld hat geschrieben:Nicht, wenn es ganz normal als Package unter /site-packages/ liegt.
Ja, tut es: C:\Python24\Lib\site-packages\numpy
Dort dann ne Menge Unterverzeichnisse wie core, numarray, oldnumeric, tests und einige Dateien.
Verfasst: Dienstag 15. Mai 2007, 17:51
von CM
Version 1.0.1 . Funktioniert der Code bei Dir tatsächlich BJ? Oder hast Du kurz was durcheinandergewürfelt?
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
Verfasst: Dienstag 15. Mai 2007, 17:58
von BlackJack
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.
Verfasst: Dienstag 15. Mai 2007, 18:12
von mod_che
Ich hab es jetzt kurzfristig so gelöst:
Code: Alles auswählen
for i in array123:
if array123[i] > 1e08:
array123[i] = -9999
print i, array123[i]
nicht schön, funktioniert aber. Melde mich morgen wieder und probiere dann Eure Beispiele aus.
Grüße
Verfasst: Dienstag 15. Mai 2007, 18:15
von mod_che
BlackJack hat geschrieben:
Es gibt bei mod_che ja zumindest eine `put()`-Methode, die sich nicht über die Argumente beschwert, aber scheinbar nichts bewirkt.
Doch, das schon, aber sie bewirkt eben nicht das, was ich suche.
Verfasst: Dienstag 15. Mai 2007, 19:40
von BlackJack
Dein Quelltext funktioniert nicht! Du benutzt die Werte als Index, das geht nicht gut.
Verfasst: Dienstag 15. Mai 2007, 19:54
von CM
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:
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)
Interessant in diesem Zusammenhang:
Code: Alles auswählen
b = numpy.ma.masked_where(a > 2.0, a)
b.filled(fill_value=9999)
b.set_fill_value(0)
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

Verfasst: Dienstag 15. Mai 2007, 20:04
von CM
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
Verfasst: Dienstag 15. Mai 2007, 20:32
von BlackJack
@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.
Verfasst: Dienstag 15. Mai 2007, 22:59
von mod_che
BlackJack hat geschrieben:Dein Quelltext funktioniert nicht! Du benutzt die Werte als Index, das geht nicht gut.
OKOK, dann eher so?
Code: Alles auswählen
for i in range(len(array123)):
if array123[i] > 1e08:
array123[i] = -9999
print i, array123[i]
ja, funkt bei mir durchaus:
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])
>>>
Das MA werde ich mir morgen mal reinziehen, kling interessant...