shape mismatch beim benutzen von mgrird

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
Zero.One
User
Beiträge: 2
Registriert: Sonntag 15. August 2010, 11:57

Hallo, ich habe eine Funktion (Test), die mit Vektoren arbeitet. Die Rückgabe soll dann geplottet werden. Leider bekomme ich dann folgenen Error, wenn ich die eingabe mit einer Konstanten vermische:

Code: Alles auswählen

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    u, v, w = test(pos, a)
  File "test.py", line 6, in test
    a = const-pos
ValueError: shape mismatch: objects cannot be broadcast to a single shape
wenn ich das vermischen mit einer Konstanten weglasse dann funktioniert das Plotten.
Was mach ich falsch , warum ist das falsch und was ist zu beachten wenn ich mit mgrid etc. arbeite.


Mfg Zero.One

Hier der Code:

Code: Alles auswählen

import math
from numpy import *
from enthought.mayavi.mlab import *

def test(const,pos):
	a = const-pos
	return a[0], a[1], a[2]

def test0(a):
	return a[0], a[1], a[2]

pos = array([1.1, 1, 0])
start = array([1,1,1])

print test(start, pos)

a = mgrid[0:1:20j, 0:1:20j, 0:1:20j]
u, v, w = test(pos, a)

quiver3d(u, v, w)
outline()
show()
BlackJack

@Zero.One: Schau Dir doch mal `pos` und `a` an. Was sollte denn da herauskommen wenn Du von einem flachen Array mit drei Werten ein mehrfach verschachteltes mit insgesamt 24000 Werten "abziehst"!?
Zero.One
User
Beiträge: 2
Registriert: Sonntag 15. August 2010, 11:57

Danke!, mgrid generiert also eine Liste mit allen möglichen Werten, die geplottet werden sollen. Ich möchte ja dass jeder einzelne Wert mit der Konstanten operriert. Müsste ich dann aus den Konstanten auch so eine Liste machen? oder gibt es eine Plotfunktion die die Werte einzelnt in die Funktion einsetzt bzw. was wäre denn so die standart Lösung für dieses Problem?

Mfg Zero.One
BlackJack

`mgrid()` erzeugt keine Liste sondern ein verschacheltes Array. In diesem Fall mit den Dimensionen 3, 20, 20, 20.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Ich würde hier auf die erste Dimension verzichten:

Code: Alles auswählen

from itertools import izip
import numpy as np
x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j]
u,v,w = (c-a for a,c in izip([x, y, z], [1.1, 1.0, 0.0]))
*-Importe sollte man übrigens vermeiden, da man leicht einen Namen überschreibt:

Code: Alles auswählen

In [1]: from random import *

In [2]: random()
Out[2]: 0.076215584769962264

In [3]: from numpy import *

In [4]: random()
---------------------------------------------------------------------------
TypeError: 'module' object is not callable
Grüße
Gerrit
Antworten