python - 用于多个起始值和终止值的矢量化 NumPy linspace

标签 python numpy multidimensional-array vectorization array-broadcasting

我需要创建一个二维数组,其中每一行的开头和结尾可能都不同。假设给出了每一行的第一个和最后一个元素,并且所有其他元素只是根据行的长度进行插值在一个简单的例子中,假设我想创建一个 3X3 数组,其起始位置相同但结束位置不同,由下面的 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= (D.T*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]

sample 运行-

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 with numexpr module用于大数据并获得内存效率和性能 -

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')

关于python - 用于多个起始值和终止值的矢量化 NumPy linspace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40624409/

相关文章:

python - 合并不同列上的两个数据框

python - 根据排列数组从一组数组中选择值

无法在 C 中初始化大型二维数组

c++ - 颜色直方图openCV中的访问维度

javascript - 在javascript中创建数组时出现问题

python - 已删除的 conda 环境仍然出现在 jupyter-lab 中。我怎样才能删除它们?

python - SQL - 查找与当前日期匹配的条目

python - 如何对 scipy.stats 测试实现多重测试

python - Django: 'Data' 对象没有属性 'save'

python - 如何使用霍夫变换查找图像中的行数?