2017-11-22 1 views
0

zu werfen Wenn ich eine Funktion schreiben, die ndarray oder scalar EingängeEffiziente Weise Skalare zu numpy Arrays

def foo(a): 
    # does something to `a` 
    # 
    # a: `x` dimensional array or scalar 
    # . . . 

    cast(a, x) 
    # deal with `a` as if it is an `x`-d array after this 

Gibt es eine effeicint Weise yo, dass cast Funktion schreiben akzeptiert? Im Grunde, was ich würde wollen, ist eine Funktion, die werfen würde:

  • a, ein scalar zu ndarray mit Form ((1,)*x)
  • b, ein ndarray mit y<x ausdrücklich ((1,) * (y-x) + b.shape) (gleich wie Rundfunk)
  • gestalten dimmt c, ein ndarray mit x Dims ist unberührt
  • d, ein ndarray wit h y>x dimmt wirft einen Fehler
  • tut es in-place (zumindest, wenn sie mit einem Array ausgehend), Doppelspeicher zu verhindern

es scheint, wie diese Funktionalität so oft in integrierten Funktionen wiederholt wird, dass Es sollte eine Abkürzung dafür geben, aber ich finde es nicht.

Ich kann a_ = np.array(a, ndmin = x, copy = False) und dann assert len(a_.shape) == x) tun, aber das macht immer noch eine Kopie von Arrays. (d. h. a_.base is a ist False). Gibt es einen Weg dazu?

+0

'np.array' nimmt einen' copy' Parameter. Wir haben gerade diesen Parameter in "Astype" untersucht. Funktionen wie 'atleast_3d' verwenden' asarray' gefolgt von 'newaxis'. 'np.expand_dims' könnte auch Ideen geben. Die meisten dieser Aktionen machen eine Ansicht, keine Kopie. Nur 'x.shape = ...' ändert die Form 'in-place'. – hpaulj

+1

'np.asarray' ist' np.array' mit 'copy = False'. – hpaulj

+0

@hpaulj 'np.asarray' nimmt jedoch keinen' ndmin' Parameter. Und irgendwie 'np.array (a, ndmin = x, copy = False)' macht immer noch eine Kopie eines Arrays für mich –

Antwort

2

asarray gibt das Array selbst (wenn mit einem Array ausgehend):

In [271]: x=np.arange(10) 
In [272]: y = np.asarray(x) 
In [273]: id(x) 
Out[273]: 2812424128 
In [274]: id(y) 
Out[274]: 2812424128  # same id 

ndmin produziert eine Ansicht:

In [276]: y = np.array(x, ndmin=2, copy=False) 
In [277]: y 
Out[277]: array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]) 
In [278]: id(x) 
Out[278]: 2812424128 
In [279]: id(y) 
Out[279]: 2811135704 # different id 
In [281]: x.__array_interface__['data'] 
Out[281]: (188551320, False) 
In [282]: y.__array_interface__['data'] # same databuffer 
Out[282]: (188551320, False) 

ndmin auf einem Array des rechten dim schon:

In [286]: x = np.arange(9).reshape(3,3) 
In [287]: y = np.array(x, ndmin=2, copy=False) 
In [288]: id(x) 
Out[288]: 2810813120 
In [289]: id(y) 
Out[289]: 2810813120  # same id 

Ähnliche Diskussion mit astype,

confused about the `copy` attribution of `numpy.astype`

+0

Huh. Wenn ich '.flags' und' .base' betrachte, erscheint es wie ein neues Array, aber das '.__ array_interface __ ['data']' ist das gleiche? Das ist ein bisschen irreführend. –

Verwandte Themen