2017-02-09 1 views
4

Sagen wir, ich habe eine Klasse, die von ndarray_plusnumpy.ndarray erbt und fügt einige zusätzliche Funktionen. Manchmal übergebe ich es an numpy Funktionen wie np.sum und bekomme ein Objekt vom Typ ndarray_plus zurück, wie erwartet.Numpy Funktionen haue meine ererbten Datentyp

Andere Zeiten, numpy Funktionen, die ich mein erweitertes Objekt übergeben, um ein numpy.ndarray Objekt zurückzugeben, die Informationen in den zusätzlichen Attributen ndarray_plus zu zerstören. Dies geschieht normalerweise, wenn die in Frage kommende numpige Funktion eine np.asarray statt np.asanyarray tut.

Gibt es eine Möglichkeit, dies zu verhindern? Ich kann nicht in die numpy Codebasis gehen und alle Instanzen von np.asarray zu np.asanyarray ändern. Gibt es einen pythonischen Weg, mein geerbtes Objekt präventiv zu schützen?

+0

Eine Unterklasse wie 'np.matrix' eine Menge Code hat gewidmet, um die Klasse und Attribute beibehalten wird. Dasselbe gilt für 'np.ma'. Das ist der Grund, warum das Unterklassifizieren von 'ndarray' keine triviale Aufgabe ist. Ich würde vorschlagen, diese Beispiele zu studieren. – hpaulj

+0

Ok, zweiter Versuch. Da Sie das definierte Verhalten von 'np.asarray' beobachten, ist es schwer zu erkennen, was Sie tun könnten. Du könntest versuchen und 'asarray' mit 'asanarray' affektieren, wenn es funktioniert und mit deinen Standards der Pythonizität kompatibel ist. –

+0

@hpaulj wie ich es gelesen habe, sobald deine Unterklasse in die Klauen von 'asarray' fällt, ist es fertig,' Matrix' ist sicherlich. –

Antwort

0

Die definierte und garantierte Verhalten von asarray ist Ihre Unterklasse Instanz zurück zur Basisklasse konvertieren

help on function asarray in numpy: 

numpy.asarray = asarray(a, dtype=None, order=None) 
Convert the input to an array. 

Parameters 
---------- 
a : array_like 
    Input data, in any form that can be converted to an array. This 
    includes lists, lists of tuples, tuples, tuples of tuples, tuples 
    of lists and ndarrays. 
dtype : data-type, optional 
    By default, the data-type is inferred from the input data. 
order : {'C', 'F'}, optional 
    Whether to use row-major (C-style) or 
    column-major (Fortran-style) memory representation. 
    Defaults to 'C'. 

Returns 
------- 
out : ndarray 
    Array interpretation of `a`. No copy is performed if the input 
    is already an ndarray. If `a` is a subclass of ndarray, a base 
    class ndarray is returned. 

See Also 
-------- 
asanyarray : Similar function which passes through subclasses. 

< - schnipp ->

Sie könnten versuchen, und monkeypatch:

>>> import numpy as np 
>>> import mpt 
>>> 
>>> s = np.matrix(3) 
>>> mpt.aa(s) 
array([[3]]) 
>>> np.asarray = np.asanyarray 
>>> mpt.aa(s) 
matrix([[3]]) 

Datei mpt.py

import numpy as np 

def aa(x): 
    return np.asarray(x) 

Leider ist dies nicht immer funktioniert.

alternative mpt.py

from numpy import asarray 

def aa(x): 
    return asarray(x) 

hier würden Sie kein Glück.

+0

Ich denke nicht, dass es klug ist, 'asarray' zu ändern. Lass es so bleiben, um 'self' in die Basisklasse zu konvertieren. 'apply_over_axes' ist eine Funktion, die' asarray' verwendet. 'np.ma.apply_over_axes' behält die Verwendung von' asarray bei. Es ersetzt 'expand_dims' durch eine eigene Version. 'np.ma.average' ist ein anderes Beispiel. 'np.matrix' verwendet' asarray', um seine '.A' und' .A1' Eigenschaften zurückzugeben. – hpaulj

+1

@hpaulj stimmte zu. Aber ich stimme auch dem OP zu, dass seine Verwendung in Bibliotheksfunktionen, die nicht wirklich konvertiert werden müssen, als ein Fehler betrachtet werden sollte. –

+0

@hpaulj vielleicht könnte man versuchen, und verwenden Sie '__array_prepare__' zu wechseln' asarray' zu 'asanyarray' und wieder einzustellen es in' __array_wrap__' die Nebenwirkungen enthalten? –

Verwandte Themen