问题描述
我需要创建一个2D数组,其中每一行都可以以不同的数字开头和结尾.假设给出了每行的第一个和最后一个元素,并且仅根据行的长度对所有其他元素进行插值.在一个简单的情况下,假设我要创建一个3X3数组,该数组的起点从0开始,但结尾由W指定,如下所示:
I need to create a 2D array where each row may start and end with a different number. Assume that first and last element of each row is given and all other elements are just interpolated according to length of the rows In a simple case let's say I want to create a 3X3 array with same start at 0 but different end given by W below:
array([[ 0., 1., 2.],
[ 0., 2., 4.],
[ 0., 3., 6.]])
是否有比以下方法更好的方法:
Is there a better way to do this than the following:
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= (D.T*W).T
推荐答案
以下是使用 broadcasting
-
Here's an approach using 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]])
让我们利用多核!
我们可以利用 multi-core
使用numexpr
模块处理大数据并获得内存效率,从而提高性能-
Let's leverage multi-core!
We can leverage multi-core
with numexpr
module for large data and to gain memory efficiency and hence performance -
import numexpr as ne
def create_ranges_numexpr(start, stop, N, endpoint=True):
if endpoint==1:
divisor = N-1
else:
divisor = N
s0 = start[:,None]
s1 = stop[:,None]
r = np.arange(N)
return ne.evaluate('((1.0/divisor) * (s1 - s0))*r + s0')
这篇关于用于多个起始值和终止值的矢量化NumPy Linspace的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!