2016-04-21 9 views
1

Ich habe eine Funktion, die auf Arrays mit mehr als einem Element funktioniert, aber fehlschlägt, wenn das Array nur ein Element enthält. Betrachten wir dieses BeispielTypeError/Array-Indexierung; 'int' Objekt unterstützt keine Item-Zuweisung

import numpy as np 

def checker(a): 
    a[a>5] = np.nan 

a = np.arange(10) 
a = checker(a) 

Works, aber

a = 1 
a = checker(a) # fails 

und gibt

Traceback (most recent call last): 
    a[a>5] = np.nan 
    TypeError: 'int' object does not support item assignment 

Ich möchte es wie MATLAB zu handhaben, und nicht wie diese Version von checker(), Das hat 4x mehr Zeilen als die obige Version.

def checker(a): 
    try: 
     a[a>5] = np.nan 
    except TypeError: 
     if a>5: a = np.nan 
+0

verwenden Was sind Sie versuchen, hier zu tun? – Eric

+0

Ich versuche, etwas zu berechnen, vorausgesetzt, einige Bedingungen erfüllt sind – Lukas

Antwort

0

In MATLAB hat alles mindestens 2 Dimensionen; in numpy Indexieren kann die Anzahl der Dimensionen reduzieren

np.shape(1) 

() ist? Dies ist das gleiche wie np.array(1).shape, d. H. Die Form (Größe in MATLAB-Termen) eines einzelnen Elementarrays. Es ist 0d, im Gegensatz zu 2d in MATLAB.

a = np.empty(np.shape(1))*np.nan 
# a = np.array(np.nan) does the same thing 

nan ist, eine einzelne Element-Array mit Wert nan.

a[False] 

Displays als array([], dtype=float), mit Form (0,); es ist jetzt 1d, aber ohne irgendwelche Elemente.

Bei einem 0d-Array ist die einzige sinnvolle Indizierung a[()], die das Element nan, eine np.float64, zurückgibt. a.item() macht das gleiche.

Und für Zuordnungszwecke kann ich nicht einen Weg finden, um den Wert dieses Elements

a[???] = 0 

Korrektur, Ellipsen ändern verwendet werden kann, da es für eine beliebige Anzahl von : einschließlich keiner steht.

a[...] = 0 
# array(0,0) 

(Sie Stab nicht a=0 da, dass nur die Variable neu zuweist).

Im Allgemeinen 0d Arrays wie diese sind möglich, aber sie sind selten nützlich.

Ich bin mir nicht ganz sicher, was Sie versuchen zu tun (Ich habe im Moment keine Octave-Sitzung). Aber dieser Unterschied, wie sich die Dimensionen mit der Indizierung ändern, ist der Schlüssel zu Ihren Problemen.

Beachten Sie, dass ich den booleschen Index ein Array erstellt habe, aber nur einen Skalar oder eine Liste. Dies liegt näher an Ihrem MATLAB-Booleschen Index.

+0

Es ergibt sich letztlich folgende Fragen: http://StackOverflow.com/Questions/25458553/is-there-a-pythonic-way-to-change-Scalar -und-0d-array-zu-1d-array http://stackoverflow.com/questions/773030/why-are-0d-arrays-in-numpy-not-considered-scalar?lq=1 – Lukas

+0

Dieser Link hat mich daran erinnert, dass 'a [...] = 0' verwendet werden kann, um die Werte eines beliebigen dimensionalen Objekts zu ändern. Aber ich sehe nicht, wie das bei der Änderung helfen würde/ändere das Problem nicht. – hpaulj

0

Um ein leeres Array mit nan s gefüllt zu erstellen, geben Sie np.fill verwenden können:

a=np.empty(np.shape(1)) 
a.fill(np.nan) 
b=False 

a[b]=10 

Sie haben einen Fehler bekommen, weil a kein Array war, war es ein Schwimmer.

0

Wenn Sie ein Skalar Array mit einem Skalar multiplizieren, nötigt numpy das Ergebnis in einem Skalar:

>>> a = np.empty(()) 
>>> a 
array(10.0) 
>>> a * 2 
20.0 

Wenn Sie die skalare als Array zu halten, dann können Sie np.asarray(a * 2)

Verwandte Themen