2

次のような N × 2 の配列があります。

[[9 1]
 [0 5]
 [6 3]
 [2 4]
 [3 5]
 [4 1]
 [2 7]
 [6 8]
 [7 9]
 [8 0]]

このマトリックスで検索を行った後、行を並べ替える必要があるいくつかのインデックスを返します。

私の場合、私は持っていましたw=[1 0 9 8 7]

このコードを使用して、選択した行でのみ2 つの列を並べ替えます。

        for x in w:
            self.nodes[x] = roll (self.nodes[x], 1)

結果は次のように正しいです。

[[1 9]  *
 [5 0]  *
 [6 3]
 [2 4]
 [3 5]
 [4 1]
 [2 7]
 [8 6]  *
 [9 7]  *
 [0 8]] *

スター付きの行は正しく並べ替えられました。

このトリックをすべて実行するONE-LINER numpy 式があるかどうかを知りたいです。

ここで重要な事実は、操作の速度です。

4

2 に答える 2

2

aこれは、インデックスのみのコピーにロールを適用し、ロールされた値でw元のインデックスを設定することで機能します。a

a[w] = np.roll(a[w], 1, axis=1)

誰かが答えを持っていました(@sebergだと思いますが、現在は削除されています)、2つの列のローリングは反転と同等であり、実際にはする必要はなくroll、インデックストリックによる反転を使用できることを示しました:

a[w] = a[w, ::-1]

大規模な配列の場合、タイミングは同様です。短い配列の場合、rollソリューションは遅くなります。これがタイミングです。

N = 10
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)

timeit a[w] = np.roll(a[w],1,1)
10000 loops, best of 3: 23.2 µs per loop

timeit a[w] = a[w, ::-1]
100000 loops, best of 3: 8.07 µs per loop

N = 1000
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)

timeit a[w] = np.roll(a[w],1,1)
10000 loops, best of 3: 113 µs per loop

timeit a[w] = a[w, ::-1]
10000 loops, best of 3: 93.6 µs per loop

N = 100000
a = np.arange(N*2).reshape(-1,2)
w = np.random.choice(np.arange(N), size=N/2, replace=False)

timeit a[w] = np.roll(a[w],1,1)
100 loops, best of 3: 10.8 ms per loop

timeit a[w] = a[w, ::-1]
100 loops, best of 3: 9.63 ms per loop
于 2013-09-23T21:34:57.623 に答える
0
self.nodes[w] = np.asarray(map(lambda x: np.roll(x,1), self.nodes[w]))
于 2013-09-23T21:30:07.037 に答える