2017-05-15 2 views
-1

Dies ist etwas, das in Fortran, Basic oder Matlab trivial wäre, aber ich kann es nicht in Python + Numpy arbeiten. Ich habe viele der Vorschläge und Beispiele ausprobiert, aber sie sind zu einfach, um dieses Problem zu lösen. Der Pseudo-Code ist wie folgt:Multiplikation von zwei Vektoren in Python

Given a vector a(i) with 500 values. 
for i=1 to 500 
    b(i) = some complicated math 
    c(i) = a(i) * b(i) 

Wie würde sich dies in Python Plus Numpy geschrieben werden?

+1

suchen Sie einen [Kreuzprodukt] (https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.cross.html) oder ein [dot Produkt] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)? –

+2

... oder ein [elementweises Produkt] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.multiply.html)? –

+0

@FredLarson judjing durch den Pseudocode geliefert, wäre es elementweise ('c (i) = a (i) * b (i)'). – Uriel

Antwort

0

würde ich so etwas wie dieses

import numpy as np 

n = 500 

# Allocate memory for a, b, c 
a = np.zeros((n)) 
b = np.zeros((n)) 
c = np.zeros((n)) 

# Loop over element 
for i in range(n): 
    b[i] = some complicated math 
    c[i] = a[i] * b[i] 
2

versuchen Sie Numpy verwenden können multiplyfunction die elementweise Vektorprodukt zu erhalten. Probieren Sie etwas wie folgt aus:

import numpy as np 

a = np.arange(500) 
b = 10 * np.arange(500) + 3 # an example of the "complex math" 
c = np.multiply(a, b) 

Beachten Sie, dass die mathematischen Operationen (* und +) werden automatisch auf alle Elemente von b angewendet.

1

Das hängt davon ab, ob die "komplizierte Mathematik" vektorisiert werden kann und ob es eine Zeile oder mehrere ist. Wenn es nicht vektorisiert und mehrere Linien nimmt werden kann, was die kompliziertere Lösung ist, können Sie etwas tun:

b = np.zeros_like(a) 
for i, ai in enumerate(a): 
    b[i] = some_complicated_math(ai) 
c = a*b 

In diesem Beispiel i ist der aktuelle Index von a und ai ist der Wert bei dieser Index (das Äquivalent von a[i]). enumerate gibt Ihnen einen Wert und seinen (1D) Index. Multiplikation in numpy Arrays ist automatisch elementweise.

Wenn die „komplizierte Mathematik“ kann nicht vektorisiert werden, sondern kann in einer Zeile durchgeführt werden, können Sie etwas tun:

b = [some_complicated_math(ai) for ai in a] 
c = a*b 

In diesem Fall b ist eine Liste (kein numpy Array) , aber python ist schlau genug, b in ein numpliges Array hinter den Kulissen zu konvertieren, da es mit dem numpy Array a multipliziert wird. Sie können b in ein numpliges Array mit np.array(b) konvertieren, wenn Sie es später benötigen.

Das einfachste Szenario ist, wenn die "komplizierte Mathematik" vektorisiert werden kann. Dann können Sie einfach tun:

b = some_complicated_math(a) 
c = a*b 

Wenn aus welchem ​​Grund auch immer, müssen Sie b und c in der Schleife setzen (der einzige Grund, warum ich wäre, wenn b Referenzen einfiel c irgendwie), dann können Sie tun dies:

b = np.zeros_like(a) 
c = np.zeros_like(a) 
for i, ai in enumerate(a): 
    b[i] = some_complicated_math(ai) 
    c[i] = a[i]*b[i] 
Verwandte Themen