我有一个像这样的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表达式可以完成所有这些操作。
这里的重要事实是操作的速度。
答案 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]))