Numpy:将值插入数组以使数组按顺序排列的最快方法

阿尔达·阿斯兰

假设我有一个数组my_array和一个奇异值my_val(请注意,my_array始终进行排序)。

my_array = np.array([1, 2, 3, 4, 5])
my_val = 1.5

因为my_val是1.5,所以我想把它放在1和2之间,给我数组[1, 1.5, 2, 3, 4, 5]

我的问题是:以my_array任意大的方式生成有序输出数组的最快方法(即微秒)是什么?

我的原始方法是将值连接到原始数组,然后进行排序:

arr_out = np.sort(np.concatenate((my_array, np.array([my_val]))))
[ 1.   1.5  2.   3.   4.   5. ]

我知道那np.concatenate是很快的事,但是我不确定会如何np.sort随着my_array增长而扩展,即使它my_array总是可以排序的。

编辑:

我已经汇总了接受答案时列出的各种方法的时间:

输入:

import timeit

timeit_setup = 'import numpy as np\n' \
               'my_array = np.array([i for i in range(1000)], dtype=np.float64)\n' \
               'my_val = 1.5'
num_trials = 1000

my_time = timeit.timeit(
    'np.sort(np.concatenate((my_array, np.array([my_val]))))',
    setup=timeit_setup, number=num_trials
)

pauls_time = timeit.timeit(
    'idx = my_array.searchsorted(my_val)\n'
    'np.concatenate((my_array[:idx], [my_val], my_array[idx:]))',
    setup=timeit_setup, number=num_trials
)

sanchit_time = timeit.timeit(
    'np.insert(my_array, my_array.searchsorted(my_val), my_val)',
    setup=timeit_setup, number=num_trials
)

print('Times for 1000 repetitions for array of length 1000:')
print("My method took {}s".format(my_time))
print("Paul Panzer's method took {}s".format(pauls_time))
print("Sanchit Anand's method took {}s".format(sanchit_time))

输出:

Times for 1000 repetitions for array of length 1000:
My method took 0.017865657746239747s
Paul Panzer's method took 0.005813951002013821s
Sanchit Anand's method took 0.014003945532323987s

对于长度为1,000,000的数组,对于100次重复也是如此:

Times for 100 repetitions for array of length 1000000:
My method took 3.1770704101754195s
Paul Panzer's method took 0.3931240139911161s
Sanchit Anand's method took 0.40981490723551417s
保罗·潘泽

用于np.searchsorted以对数时间查找插入点:

>>> idx = my_array.searchsorted(my_val)
>>> np.concatenate((my_array[:idx], [my_val], my_array[idx:]))
array([1. , 1.5, 2. , 3. , 4. , 5. ])

注意1:建议您查看@Willem Van Onselm和@hpaulj的有见地的评论。

注意2:np.insert如果所有数据类型从一开始就都匹配,则使用@Sanchit Anand的建议可能会更方便一些。但是,值得一提的是,这种便利是以大量开销为代价的:

>>> def f_pp(my_array, my_val):
...      idx = my_array.searchsorted(my_val)
...      return np.concatenate((my_array[:idx], [my_val], my_array[idx:]))
... 
>>> def f_sa(my_array, my_val):
...      return np.insert(my_array, my_array.searchsorted(my_val), my_val)
...
>>> my_farray = my_array.astype(float)
>>> from timeit import repeat
>>> kwds = dict(globals=globals(), number=100000)
>>> repeat('f_sa(my_farray, my_val)', **kwds)
[1.2453778409981169, 1.2268288589984877, 1.2298014000116382]
>>> repeat('f_pp(my_array, my_val)', **kwds)
[0.2728819379990455, 0.2697303680033656, 0.2688361559994519]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

按顺序排列数组变量

C按字母顺序排列的数组

PHP数组按desc顺序排列

将零插入 numpy 数组的最快方法

数组公式如何与等级配合使用?按顺序排列,无重复,按顺序排列

按属性按字母顺序排列 SimpleXML 数组

如何从数组中按字母顺序获取第一个值或按字母顺序排列该数组?

VBA排序二维数组(按字母顺序排列的文本值)——优化

使用python中的决胜球按顺序排列2D数组中的值

角度-创建按字母顺序排列的对象数组

str_replace和不按顺序排列的数组

按字母顺序排列多个数组元素

使用数组/ if语句按字母顺序排列表数据

构造对象的按字母顺序排列的数组

如何将 x 轴值按顺序排列

以特定顺序排列的 Javascript 数组,将 0 添加到无值

PHP-对数组进行重新排序(如果它包含特定值)并且这些数组按特定顺序排列

按字母顺序排列excel值

按值字母顺序排列HashMap

将动态对象按顺序排列

以特定顺序排列数组中的元素

按字母顺序排列数组,然后按大写,然后按小写

如何按字母顺序排列数组,标点符号优先

使用数组索引创建按字母顺序排列的表列表的函数

按字母数字顺序排列数组并带有条件

如何使用映射文件 vb.net 按字典顺序排列数组

PHP,按字母顺序排列,一个字母数组

按顺序排列的子集数组,其中下标超出范围

按用户名的字母顺序排列多个数组