2016-07-30 15 views
4

Als mentioned here und here, das nicht mehr in numpy 1.7+ funktioniert:Neudefinition * = Operator in numpy

import numpy 
A = numpy.array([1, 2, 3, 4], dtype=numpy.int16) 
B = numpy.array([0.5, 2.1, 3, 4], dtype=numpy.float64) 
A *= B 

Eine Abhilfe ist zu tun:

def mult(a,b): 
    numpy.multiply(a, b, out=a, casting="unsafe") 

def add(a,b): 
    numpy.add(a, b, out=a, casting="unsafe") 

mult(A,B) 

aber das ist viel zu lange für jede Matrixoperation schreiben!

Wie kann der Operator 0nepy *= überschreiben, um dies standardmäßig zu tun?

Soll ich Unterklasse etwas?

+0

'A * = B' erspart Ihnen nur 3 Zeichen über' mult (A, B) '. Können Sie artikulieren, warum Sie die kürzeste Methode haben müssen? – SethMMorton

+0

@SethMMorton: * besser explizit als implizit *: '* =' ist Standard unter allen wichtigen Programmiersprachen; eine "mult" -Funktion zu definieren ist nicht natürlich – Basj

+0

Was willst du, dass 'A' hier endet? – Eric

Antwort

6

Sie können np.set_numeric_ops verwenden, um Array-Arithmetik Methoden außer Kraft setzen:

import numpy as np 

def unsafe_multiply(a, b, out=None): 
    return np.multiply(a, b, out=out, casting="unsafe") 

np.set_numeric_ops(multiply=unsafe_multiply) 

A = np.array([1, 2, 3, 4], dtype=np.int16) 
B = np.array([0.5, 2.1, 3, 4], dtype=np.float64) 
A *= B 

print(repr(A)) 
# array([ 0, 4, 9, 16], dtype=int16) 
1

Sie können eine allgemeine Funktion erstellen und das gewünschte Attribut, um es passieren:

def calX(a,b, attr): 
    try: 
     return getattr(numpy, attr)(a, b, out=a, casting="unsafe") 
    except AttributeError: 
     raise Exception("Please enter a valid attribute") 

Demo:

>>> import numpy 
>>> A = numpy.array([1, 2, 3, 4], dtype=numpy.int16) 
>>> B = numpy.array([0.5, 2.1, 3, 4], dtype=numpy.float64) 
>>> calX(A, B, 'multiply') 
array([ 0, 4, 9, 16], dtype=int16) 
>>> calX(A, B, 'subtract') 
array([ 0, 1, 6, 12], dtype=int16) 

Beachten Sie, wenn Sie das Ergebnis außer Kraft setzen möchten, können Sie nur die Rückkehr der Funktion zuweisen zur ersten Matrix.

A = calX(A, B, 'multiply') 
+0

Können Sie ein Anwendungsbeispiel zeigen? – Basj

+0

@Basj Überprüfen Sie das Update. – Kasramvd

+0

Schön, aber das ist nicht kürzer als 'mult (A, B)' mit 'def mult (a, b): numpy.multiply (a, b, aus = a, casting =" unsicher ")' ... Was ich want ist override 'A * = B' – Basj