当前位置 : 主页 > 手机开发 > 无线 >

数组 – 通过向前移动其他元素来在数组中更改元素的位置 – NumPy

来源:互联网 收集:自由互联 发布时间:2021-06-10
在搜索之后,我找不到原生方式或当前解决方案来有效地改变numpy数组中元素的位置,这在我看来非常自然.例如,如果我想在第一个位置移动第3个元素,它应该是这样的: x = np.array([1,2,3,4
在搜索之后,我找不到原生方式或当前解决方案来有效地改变numpy数组中元素的位置,这在我看来非常自然.例如,如果我想在第一个位置移动第3个元素,它应该是这样的:

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))
网友评论