2017-10-11 2 views
2

Angenommen, ich habe 2 numplige 2D-Arrays, Mins und Maxs, die immer die gleiche Dimension haben. Ich möchte ein drittes Array erstellen, results, das ist das Ergebnis der Anwendung von linspace auf max und min Wert. Gibt es eine "numpige"/vektorisierte Möglichkeit, dies zu tun? Beispiel nicht-vektorisierter Code ist unten, um Ergebnisse zu zeigen, die ich möchte.Vectorized NumPy linspace über mehrdimensionale Arrays

import numpy as np 

mins = np.random.rand(2,2) 
maxs = np.random.rand(2,2) 

# Number of elements in the linspace 
x = 3 

m, n = mins.shape 
results = np.zeros((m, n, x)) 

for i in range(m): 
    for j in range(n): 
     min = mins[i][j] 
     max = maxs[i][j] 
     results[i][j] = np.linspace(min, max, num=x) 
+0

Wie wäre es, die Ergebnisse von 'np.linspace Skalierung (0,1, num = x) '? – hpaulj

+0

Wie würde ich in diesem Fall die Min- und Max-Werte erhalten? – holtc

+1

'mins [..., keine] + (maxs-mins) [..., keine] * np.linspace (0,1, num = x)'. Dies verwendet Broadcasting, um den "lnnenraum" um die "Mins" und "Maxs" zu skalieren. – hpaulj

Antwort

3

Hier ist ein vektorisiert Ansatz basiert auf this post für generische n-dim Fälle abzudecken -

def create_ranges_nd(start, stop, N, endpoint=True): 
    if endpoint==1: 
     divisor = N-1 
    else: 
     divisor = N 
    steps = (1.0/divisor) * (stop - start) 
    return start[...,None] + steps[...,None]*np.arange(N) 

Probelauf -

In [536]: mins = np.array([[3,5],[2,4]]) 

In [537]: maxs = np.array([[13,16],[11,12]]) 

In [538]: create_ranges_nd(mins, maxs, 6) 
Out[538]: 
array([[[ 3. , 5. , 7. , 9. , 11. , 13. ], 
     [ 5. , 7.2, 9.4, 11.6, 13.8, 16. ]], 

     [[ 2. , 3.8, 5.6, 7.4, 9.2, 11. ], 
     [ 4. , 5.6, 7.2, 8.8, 10.4, 12. ]]]) 
Verwandte Themen