3

整数値の配列があります。

a = [2,1,4,0,2]

arange 関数を a の各値に適用して、次のようにします。

b = [0,1,0,0,1,2,3,1,2]
b "=" [arange(2),arange(1),arange(4),arange(0),arange(2)] 

実際、私は np.repeat 関数を使用して配列 a に従って配列行を繰り返します。i のマークを付けて、繰り返される各値を元の値にリンクし、識別番号を付けてそれらを区別したいと考えています。

np.vectorize を試しましたが、成功しませんでした。

4

4 に答える 4

3

物事を行うには、間違いなくもっと多くのnumpythonicな方法があります。1つの可能性は次のようなものである可能性があります。

import numpy as np
from numpy.lib.stride_tricks import as_strided

def concatenated_ranges(ranges_list) :
    ranges_list = np.array(ranges_list, copy=False)
    base_range = np.arange(ranges_list.max())
    base_range =  as_strided(base_range,
                             shape=ranges_list.shape + base_range.shape,
                             strides=(0,) + base_range.strides)
    return base_range[base_range < ranges_list[:, None]]

少数の範囲のみを連結する場合は、おそらくE氏の純粋なPythonソリューションが最適ですが、連結する範囲が100程度しかない場合は、この星の方が著しく高速です。比較のために、他の回答から抽出したこの2つの関数を使用しました。

def junuxx(a) :
    b = np.array([], dtype=np.uint8)
    for x in a:
        b = np.append(b, np.arange(x))
    return b

def mr_e(a) :
    return reduce(lambda x, y: x + range(y), a, [])

そして、ここにいくつかのタイミングがあります:

In [2]: a = [2, 1, 4, 0 ,2] # the OP's original example

In [3]: concatenated_ranges(a) # show it works!
Out[3]: array([0, 1, 0, 0, 1, 2, 3, 0, 1])

In [4]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 31.6 us per loop

In [5]: %timeit junuxx(a)
10000 loops, best of 3: 34 us per loop

In [6]: %timeit mr_e(a)
100000 loops, best of 3: 2.58 us per loop

In [7]: a = np.random.randint(1, 10, size=(10,))

In [8]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 27.1 us per loop

In [9]: %timeit junuxx(a)
10000 loops, best of 3: 79.8 us per loop

In [10]: %timeit mr_e(a)
100000 loops, best of 3: 7.82 us per loop

In [11]: a = np.random.randint(1, 10, size=(100,))

In [12]: %timeit concatenated_ranges(a)
10000 loops, best of 3: 57.4 us per loop

In [13]: %timeit junuxx(a)
1000 loops, best of 3: 756 us per loop

In [14]: %timeit mr_e(a)
10000 loops, best of 3: 149 us per loop

In [15]: a = np.random.randint(1, 10, size=(1000,))

In [16]: %timeit concatenated_ranges(a)
1000 loops, best of 3: 358 us per loop

In [17]: %timeit junuxx(a)
100 loops, best of 3: 9.38 ms per loop

In [18]: %timeit mr_e(a)
100 loops, best of 3: 8.93 ms per loop
于 2013-02-26T18:23:02.973 に答える
2

私の答えは Junuxx に似ています - あなたが b に対して与えた答えがあなたが望むものかどうかはわかりません

a = [2, 1, 4, 0 ,2]
reduce(lambda x, y: x+range(y), a, [])

私に与えます

[0, 1, 0, 0, 1, 2, 3, 0, 1]
于 2013-02-26T12:51:44.087 に答える
1

これは、あなたが説明しているように見えること、つまり のすべての値の aranges の連結を行いますa。あなたが与えるにはいくつかのエラーがあることを意味しbますが:

>>> a = [2, 1, 4, 0, 2]
>>> b = np.array([], dtype=np.uint8)
>>>for x in a:
>>>    b = np.append(b, np.arange(x))
>>> print b
array([0,1,0,0,1,2,3,0,1,])

範囲のリストが必要であることを説明する編集の後、これはより効果的だと思います:

>>> a = [2, 1, 4, 0, 2]
>>> b = [np.arange(x) for x in a]
>>> print b
[array([0, 1]), array([0]), array([0, 1, 2, 3]), array([], dtype=int32),
 array([0, 1])]
于 2013-02-26T12:50:53.707 に答える