像OP这样使用linspace
的假设是所有行的起始值都为0。
x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
(编辑 - 这是我应该得到的转置;要么进行转置,要么切换使用[:,None]
)
对于N = 3000,它比@Divaker的
解决方案快得多。 我不完全确定为什么。
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
1 loop, best of 3: 227 ms per loop
所有这些解决方案都只是对在“starts”和“stops”之间进行线性插值的想法的变化。
pd.Series(W).apply(lambda e: np.linspace(0, e, 3))
- Zeugma