8

で Python を使用しnumpyます。

私はインデックスのnumpy配列を持っていますa:

>>> a
array([[5, 7],
       [12, 18],
       [20, 29]])
>>> type(a)
<type 'numpy.ndarray'>

私はインデックスのnumpy配列を持っていますb:

>>> b
array([[2, 4],
       [8, 11],
       [33, 35]])
>>> type(b)
<type 'numpy.ndarray'>

a配列と配列を結合する必要がありますb:

a+ b=>[2, 4] [5, 7] [8, 11] [12, 18] [20, 29] [33, 35]

=>aそしてbインデックスの配列があります => [2, 18] [20, 29] [33, 35]

( インデックス([2, 4][5, 7][8, 11][12, 18])は順番に

=> 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18=> [2, 18])

この例では:

>>> out_c
array([[2, 18],
       [20, 29],
       [33, 35]])

誰かが提案してもらえますか、どうすれば入手できout_cますか?

更新: @Geoff は、複数の範囲の python unionソリューションを提案しました。このソリューションが大規模なデータ配列で最速かつ最高かどうか?

4

3 に答える 3

3

きれいではありませんが、うまくいきます。私は最後のループが好きではありません。

ab = np.vstack((a,b))
ab.sort(axis=0)

join_with_next = ab[1:, 0] - ab[:-1, 1] <= 1
endpoints = np.concatenate(([0],
                            np.where(np.diff(join_with_next) == True)[0]  + 2,
                            [len(ab,)]))
lengths = np.diff(endpoints)
new_lengths = lengths.copy()
if join_with_next[0] == True:
    new_lengths[::2] = 1
else:
    new_lengths[1::2] = 1
new_endpoints = np.concatenate(([0], np.cumsum(new_lengths)))
print endpoints, lengths
print new_endpoints, new_lengths

starts = endpoints[:-1]
ends = endpoints[1:]
new_starts = new_endpoints[:-1]
new_ends = new_endpoints[1:]
c = np.empty((new_endpoints[-1], 2), dtype=ab.dtype)

for j, (s,e,ns,ne) in enumerate(zip(starts, ends, new_starts, new_ends)):
    if e-s != ne-ns:
        c[ns:ne] = np.array([np.min(ab[s:e, 0]), np.max(ab[s:e, 1])])
    else:
        c[ns:ne] = ab[s:e]

>>> c
array([[ 2, 18],
       [20, 29],
       [33, 35]])
于 2013-04-03T15:56:55.227 に答える
1

おそらく、numpy.concatenate() を使用して配列を結合し、各行の最小値と最大値を見つけて、各行の最小値と最大値の行列として c を作成することができます。

あるいは、np.minimum と np.maximum は 2 つの配列を比較して最小値と最大値を見つけるので、各行の最小値と最大値を見つけて行列 c に割り当てることができます。

于 2013-04-03T13:26:01.503 に答える