2017-01-25 8 views
2

Ich habe ein numpy 1dimensional Array mit n Werten lassen Sie uns anrufen xdata.Wie erstellt man ein mehrdimensionales numpy Array?

Ich möchte ein multidimensionales numpy Array erstellen lassen Sie es xdataMulti so nennen, dass jede Dimension dieses Arrays Werte in xdata enthält, die sich in einem bestimmten Bereich befinden.

Zum Beispiel können sagen, dass

xdata = np.array([-0.879645943,-0.7897614865,-0.7051130178,-0.6108652382,-0.5270894341,...]) 

und ich möchte alle Werte von xdata setzen zwischen -0.9 und -0.6 in xdataMulti[:,0] und alle Werte zwischen -0.6 und 0 in xdataMulti[:,1] usw.

Wie Ich erstelle und fülle xdataMulti (Ich weiß im Voraus, wie viele Bereiche ich habe und ihre Endpunkte, aber ich weiß nicht, wie viele Punkte von xdata in jedem Bereich sind, muss ich durch xdata durchlaufen, um herauszufinden)?

+1

Das ist nicht wirklich das, was numpy (multi-) dimensionale Arrays für gemeint sind! Die Länge der Einträge in jeder Dimension sollte gleich sein. – Lagerbaer

+1

Sie beschreiben eine Liste von Arrays unterschiedlicher Größe. – hpaulj

+0

Ja, es ist eine Liste von Arrays unterschiedlicher Größe. Ich brauche jedes ein numpy Array, um eine scipy Funktion aufzurufen, die nur numpy Arrays akzeptiert. – user2175783

Antwort

2

Wenn Ihre Anzahl der Bereiche nicht zu groß ist, können Sie sie von Hand erstellen

gm09 = xdata >= -0.9 
gm06 = xdata >= -0.6 
g0 = xdata >= 0 
ranges = [xdata[gm09 & ~gm06], xdata[gm06 & ~g0]] 
result = [f(r) for r in ranges] 

wobei f Ihre scipy Funktion ist. Wenn Ihre Anzahl an Bereichen groß ist, können Sie Ihre Daten sortieren und dann searchsorted verwenden. Angenommen, Sie haben die Grenzen der Blöcke im sortierten Array bnd:

xs = np.sort(xdata) 
xbnd = np.searchsorted(xs, bnd) 
ranges = [xs[l:r] for l, r in zip(xbnd[:-1], xbnd[1:])] 
result = [f(r) for r in ranges] 

Beachten Sie, dass diese von der ersten Lösung unterscheidet, dass Ihre Bereiche sortiert werden.

Wenn Sie die ursprüngliche Reihenfolge erhalten möchten, können Sie indirekt verwenden Sortier

order = np.argsort(xdata) 
xbnd = np.searchsorted(xdata[order], bnd) 
ordord = [np.sort(order[l:r]) for l, r in zip(xbnd[:-1], xbnd[1:])] 
ranges = [xdata[oo] for oo in ordord] 
result = [f(r) for r in ranges] 
+1

Im mittleren Code * xs = np.sort (xdata) xbnd = np.searchsorted (xs, bnd) Bereiche = [xs [l: r] für l, r in zip (xbnd [: - 1], xbnd [1:])] result = [f (r) für r in den Bereichen] * stell dir xbnd vor [6,18], dann ist zip [(6,18)] und das range-Objekt enthält nur den Bereich zwischen 6 und 18 (zwischen 0 und 6 und 18 und letzte werden nicht ausgewählt). – JennyToy

+1

@JennyToy Hm, ist das nicht so wie es sein sollte? Wenn xbnd bei sechs beginnt, bedeutet dies, dass die kleinsten sechs Werte in xdata unter der kleinsten Bin-Grenze liegen. Es gibt also keinen Bin, in dem sie sich befinden sollten, zumindest in Bezug auf den ursprünglichen Q.Wenn Sie diese Ausreißer sammeln möchten, können Sie immer etwas wie xbnd = np.r_ [0, xbnd, len (xdata)] tun –

1

multidimensionale Arrays müssen rechteckig sein. Wenn also nicht alle Zeilen/Spalten die gleiche Länge haben, haben Sie kein Glück.

Es gibt jedoch Möglichkeiten, damit umzugehen. Eine Möglichkeit wäre, eine schaffen list von arrays:

>>> arr = np.random.random((10)) # using this for values 

>>> # each item in ranges corresponds to the lower and upper border. 
>>> ranges = [(0, 0.3), (0.3, 0.6), (0.6, 1)] 

>>> [arr[(arr >= lower) & (arr < upper)] for lower, upper in ranges] 
[array([ 0.15346374]), 
array([ 0.38144735, 0.45017858, 0.52710788, 0.36339812]), 
array([ 0.79770651, 0.77543868, 0.94824291, 0.87412998, 0.70890894])] 

Das ist nicht ein mehrdimensionales Array, nur eine Liste von Arrays, aber je nach Ihren Bedürfnissen, die genug sein können.

Verwandte Themen