Vectorized NumPy linspace用于多个启动和停止值
我需要创build一个二维数组,其中每行可以开始和结束与不同的数字。 假设给出每行的第一个和最后一个元素,并根据行的长度插入所有其他元素。在一个简单的例子中,假设我想创build一个3X3的数组,其起点为0,但是不同的末尾由W给出:
array([[ 0., 1., 2.], [ 0., 2., 4.], [ 0., 3., 6.]])
有没有比这更好的方法来做到这一点:
D=np.ones((3,3))*np.arange(0,3) D=D/D[:,-1] W=np.array([2,4,6]) # last element of each row assumed given Res= (DT*W).T
这是一个使用broadcasting
的方法 –
def create_ranges(start, stop, N, endpoint=True): if endpoint==1: divisor = N-1 else: divisor = N steps = (1.0/divisor) * (stop - start) return steps[:,None]*np.arange(N) + start[:,None]
样品运行 –
In [22]: # Setup start, stop for each row and no. of elems in each row ...: start = np.array([1,4,2]) ...: stop = np.array([6,7,6]) ...: N = 5 ...: In [23]: create_ranges(start, stop, 5) Out[23]: array([[ 1. , 2.25, 3.5 , 4.75, 6. ], [ 4. , 4.75, 5.5 , 6.25, 7. ], [ 2. , 3. , 4. , 5. , 6. ]]) In [24]: create_ranges(start, stop, 5, endpoint=False) Out[24]: array([[ 1. , 2. , 3. , 4. , 5. ], [ 4. , 4.6, 5.2, 5.8, 6.4], [ 2. , 2.8, 3.6, 4.4, 5.2]])
就像OP的linspace
假设所有行的开始都是0。
x=np.linspace(0,1,N)[:,None]*np.arange(0,2*N,2)
(编辑 – 这是我应该得到的转置;转置它或切换使用[:,None]
)
对于N = 3000,它明显比@Divaker's
解决scheme更快。 我不完全确定为什么。
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 (DT*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
所有这些解决scheme只是在starts
和stops
之间进行线性插值的想法的变体。