在N乘2阵列中反转某些行

时间:2013-09-23 21:22:59

标签: python numpy

我有一个像这样的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列 ONLY

        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表达式可以完成所有这些操作。

这里的重要事实是操作的速度。

2 个答案:

答案 0 :(得分:2)

这可以通过仅将卷a应用于索引w,然后使用滚动值将原始a中的卷设置为{<1}}来实现。

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

有人得到了答案(我认为@seberg,但现在已删除)表明,对于两列滚动相当于倒车,你实际上不需要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

答案 1 :(得分:0)

self.nodes[w] = np.asarray(map(lambda x: np.roll(x,1), self.nodes[w]))