Wie der diese Verwendung des OP von linspace
nimmt der Start ist 0 für alle Zeilen.
x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
(bearbeiten - das ist die transponierte, was ich bekommen sollte, entweder es umsetzen oder die Verwendung von [:,None]
wechseln)
Für N = 3000, ist es deutlich schneller als @Divaker's
Lösung. Ich bin mir nicht ganz sicher warum.
In [132]: timeit N=3000;x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
10 loops, best of 3: 91.7 ms per loop
In [133]: timeit create_ranges(np.zeros(N),np.arange(0,2*N,2),N)
1 loop, best of 3: 197 ms per loop
In [134]: def foo(N):
...: D=np.ones((N,N))*np.arange(N)
...: D=D/D[:,-1]
...: W=np.arange(0,2*N,2)
...: return (D.T*W).T
...:
In [135]: timeit foo(3000)
1 loop, best of 3: 454 ms per loop
============
Mit startet und stoppt ich verwenden könnte:
In [201]: starts=np.array([1,4,2]); stops=np.array([6,7,8])
In [202]: x=(np.linspace(0,1,5)[:,None]*(stops-starts)+starts).T
In [203]: x
Out[203]:
array([[ 1. , 2.25, 3.5 , 4.75, 6. ],
[ 4. , 4.75, 5.5 , 6.25, 7. ],
[ 2. , 3.5 , 5. , 6.5 , 8. ]])
Mit den zusätzlichen Berechnungen, dass es langsamer etwas macht als create_ranges
.
In [208]: timeit N=3000;starts=np.zeros(N);stops=np.arange(0,2*N,2);x=(np.linspace(0,1,N)[:,None]*(stops-starts)+starts).T
1 loop, best of 3: 227 ms per loop
Alle diese Lösungen sind nur Variationen der Idee, eine lineare Interpolation zwischen den starts
und stops
zu tun.
Wenn Sie Pandas verwenden möchten: 'pd.Series (W) .apply (Lambda e: np.linspace (0, e, 3))' – Boud
Grundsätzlich haben Sie zwei Vektoren (erste und letzte Spalten Ihrer Matrix) , richtig? Und Sie möchten dann für jede Zeile einige Werte interpolieren. – Kartik
@dayum Wenn Sie die Anfangspositionen ändern möchten, ist es die gleiche Vorgehensweise, aber Sie erstellen ein DF mit zwei Vektoren starten und stoppen, und Sie rufen erneut mit dem Lambda-Argument df.start, df.end, 3 – Boud