在搜索之后,我找不到原生方式或当前解决方案来有效地改变numpy数组中元素的位置,这在我看来非常自然.例如,如果我想在第一个位置移动第3个元素,它应该是这样的: x = np.array([1,2,3,4
x = np.array([1,2,3,4,5]) f*(x, 3, 1) print x array([1,4,2,3,5])
我在这里寻找一个f *功能.这不同于滚动每个元素,也适用于大数组中的移动我想避免使用插入和删除操作可以使用的复制操作
在过去,我发现简单的numpy索引,即[: – 1] = a [1:]比大多数替代(包括np.roll())更快.将其他两个答案与“到位”班次进行比较,我得到:从40000转为100
1.015ms divakar 1.078ms hpaulj 29.7micro s in place shift (34 x faster)
从40000转换到39900
0.975ms divakar 0.985ms hpaulj 3.47micro s in place shift (290 x faster)
时序比较使用:
import timeit init = ''' import numpy as np def divakar(in_arr, pick_idx, put_idx ): range_arr = np.arange(in_arr.size) tmp = in_arr[pick_idx] in_arr[range_arr != put_idx ] = in_arr[range_arr != pick_idx] in_arr[put_idx] = tmp def hpaulj(arr, fr, to): L = arr.shape[0] idx = np.concatenate((np.arange(to), [fr], np.arange(to, fr), np.arange(fr+1, L))) return arr[idx] def paddyg(arr, fr, to): if fr >= arr.size or to >= arr.size: return None tmp = arr[fr].copy() if fr > to: arr[to+1:fr+1] = arr[to:fr] else: arr[fr:to] = arr[fr+1:to+1] arr[to] = tmp return arr a = np.random.randint(0, 1000, (100000)) ''' fns = [''' divakar(a, 40000, 100) ''', ''' hpaulj(a, 40000, 100) ''', ''' paddyg(a, 40000, 100) '''] for f in fns: print(timeit.timeit(f, setup=init, number=1000))