與OP的這種使用linspace
一樣,假定所有行的開始都是0。
x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
(編輯 - 這是我應該得到什麼轉置;要麼調換,或切換使用[:,None]
)
對於N = 3000,這是明顯快@Divaker's
解決方案。我不完全確定爲什麼。
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
============
隨着啓動和停止,我可以使用:
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. ]])
隨着額外的計算,使得比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
所有這些解決方案都只是變化做starts
和stops
之間的線性插值的想法。
如果你想使用熊貓:'pd.Series(W).apply(lambda:np.linspace(0,e,3))' – Boud
基本上你有兩個向量(矩陣的第一列和最後一列) ,對嗎?然後你會爲每一行插入一些值。 – Kartik
@dayum如果你想改變開始位置,它是一樣的方法,但是你建立一個帶有兩個向量的df,並且你可以再次調用lambda參數df.start,df.end,3 – Boud