2016-07-21 16 views
2

Was ich versuche zu tun, ist eine Tabelle basierend auf einer stückweisen Funktion in Python zu machen. Zum Beispiel, sagen, dass ich diesen Code schrieb:Vergleichen von Skalaren mit Numpy-Arrays

import numpy as np 
from astropy.table import Table, Column 
from astropy.io import ascii 
x = np.array([1, 2, 3, 4, 5]) 
y = x * 2 
data = Table([x, y], names = ['x', 'y']) 
ascii.write(data, "xytable.dat") 
xytable = ascii.read("xytable.dat") 
print xytable 

Dies funktioniert wie erwartet, es eine Tabelle druckt die x Werte 1 bis 5 und y Werte 2, 4, 6, 8, 10.

hat aber Was ist, wenn ich statt yx * 2 nur dann haben möchte, wenn x 3 oder weniger ist, und yx + 2 sonst sein?

Wenn ich hinzufügen:

if x > 3: 
    y = x + 2 

heißt es:

Der Wahrheitswert eines Arrays mit mehr als einem Element nicht eindeutig ist. Verwenden Sie a.any() oder a.all()

Wie kann ich meine Tabelle so codieren, dass sie als stückweise Funktion funktioniert? Wie kann ich Skalare mit Numpy-Arrays vergleichen?

+1

Diese Frage hat nichts mit der Astropie oder der Table-Klasse zu tun. So lesen Sie Ihre Daten ein. Sie sollten Ihre Frage mit "numpy" markieren und für das Beispiel einfach die Nummernfelder x, y verwenden. Um zu tun, was Sie wollen, verwenden Sie [numpy.where] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html) oder [numpy.choose] (http: // docs. scipy.org/doc/numpy/reference/generated/numpy.choose.html). – Christoph

+0

@Christoph: guter Punkt; aktualisierte Tags – bernie

Antwort

3

Sie möglicherweise numpy.where() verwenden können:

In [196]: y = np.where(x > 3, x + 2, y) 

In [197]: y 
Out[197]: array([2, 4, 6, 6, 7]) 

Der obige Code wird die Arbeit erledigt in einem voll vektorisierte Art und Weise. Dieser Ansatz ist im Allgemeinen effizienter (und wohl eleganter) als die Verwendung von List-Comprehensions und Type-Conversions.

+0

Es gibt das richtige Array aus, aber es ändert nicht die y-Werte, die ich brauche, um die Tabelle zu erstellen. Vielen Dank trotzdem! –

+0

Sie müssen einfach den Ausgang zu "y" zuweisen. Bearbeitete meine Antwort, um dir zu zeigen, wie 'y' tatsächlich verändert wird. – Tonechas

+0

in Ordnung ja. Das habe ich übersehen. Nochmals vielen Dank! –

1

Beginnen Sie nicht mit numpy (oder vielleicht können Sie, ich weiß nicht numpy) und tun Sie einfach in regelmäßigen Python-Listen.

x = [ 1, 2, 3, 4, 5 ] 
y = [ i * 2 if i < 3 else i + 2 for i in x ] 
print y 

Ausgänge:

[2, 4, 5, 6, 7] 

Dann können Sie es eine numpy Array machen:

x = np.array(x) 
y = np.array(y)