開始 - python 等比数列




複数の開始値と停止値のためのベクトル化されたNumPy linspace (3)

各行の開始番号と終了番号が異なる2D配列を作成する必要があります。 各行の最初と最後の要素が与えられ、他のすべての要素は行の長さに応じて補間されると仮定します。

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  

NumPy> = 1.16.0:

np.linspace パラメーターを start および stop する配列のような値を提供できるようになり np.linspace

質問にある例の構文は次のとおりです。

>>> np.linspace((0, 0, 0), (2, 4, 6), 3, axis=1)
array([[0., 1., 2.],
       [0., 2., 4.],
       [0., 3., 6.]])

新しい axis パラメータは、データが生成される方向を指定します。 デフォルトでは 0 です。

>>> np.linspace((0, 0, 0), (2, 4, 6), 3)
array([[0., 0., 0.],
       [1., 2., 3.],
       [2., 4., 6.]])

@Divakarのソリューションに基づいて機能を少し拡張しました。 速度はいくらか犠牲になりますが、スカラーのみではなく、異なる長さの N に対して互換性があります。 さらに、このバージョンは @Saulloのソリューション よりも高速 です

def create_ranges_divak(starts, stops, N, endpoint=True):
    if endpoint==1:
        divisor = N-1
    else:
        divisor = N
    steps = (1.0/divisor) * (stops - starts)
    uni_N = np.unique(N)
    if len(uni_N) == 1:
        return steps[:,None]*np.arange(uni_N) + starts[:,None]
    else:
        return [step * np.arange(n) + start for start, step, n in zip(starts, steps, N)]

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

マルチコアを活用しましょう!

numexpr モジュール を使用して multi-core 活用し、大規模なデータに対応し、メモリ効率とパフォーマンスを向上させることができます-

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-broadcasting