in 1D-Array Wert x an Stelle y schreiben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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.
Python rockt.
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. ])
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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'
>>>
Python rockt.
BlackJack

Du hast eine neuere Version als ich:

Code: Alles auswählen

In [162]: numpy.__version__
Out[162]: '1.0rc1'
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?
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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?
Python rockt.
Benutzeravatar
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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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.
Python rockt.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
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.
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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
Python rockt.
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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.
Python rockt.
BlackJack

Dein Quelltext funktioniert nicht! Du benutzt die Werte als Index, das geht nicht gut.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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 :oops:
Zuletzt geändert von CM am Dienstag 15. Mai 2007, 20:15, insgesamt 2-mal geändert.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
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.
mod_che
User
Beiträge: 46
Registriert: Freitag 13. April 2007, 16:58

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...
Python rockt.
Antworten