Python 计算速度最快的方法,从numpy数组中生成每n个元素的新numpy数组

Python 计算速度最快的方法,从numpy数组中生成每n个元素的新numpy数组,python,arrays,numpy,Python,Arrays,Numpy,假设一个一维numpy数组。我想创建一个新数组,它包含每n个元素。计算速度最快的方法是什么 例如: a = numpy.arange(1,10) b = numpy.fancytricks(a,?) # b is now [2,4,6,8] if n = 2. 编辑:问题的重要部分加粗 最快的方法是用纯C编写扩展模块,并使用直接访问数据。如果您使用或其他类似工具为您编写C,您可能会看到自动引用计数中的少量性能损失。由于您仍然必须在手写C中进行手动引用计数,因此差异可能可以忽略不计,甚至不存在

假设一个一维numpy数组。我想创建一个新数组,它包含每n个元素。计算速度最快的方法是什么

例如:

a = numpy.arange(1,10)
b = numpy.fancytricks(a,?)
# b is now [2,4,6,8] if n = 2. 

编辑:问题的重要部分加粗

最快的方法是用纯C编写扩展模块,并使用直接访问数据。如果您使用或其他类似工具为您编写C,您可能会看到自动引用计数中的少量性能损失。由于您仍然必须在手写C中进行手动引用计数,因此差异可能可以忽略不计,甚至不存在

这将比NumPy提供的现成切片语法稍微少一些开销。但是,假设您正确使用NumPy,总体性能增益可能很小且恒定,因此我不清楚在任何合理的情况下这是否值得付出额外的努力

b = a[1::step]

计算成本
O(n)
,您正在使用
长度(a)/步长“生成”一个循环

更新:
计算成本
O(1)
,没有
numpy.array
对象重新排列,只有一个常量。。。在访问方法中。。。已设置/更改。一旦部署,访问速度与更新前存储的值相同


@jme提供了一种实现采样目标的方法,但对速度没有任何保证。您希望对速度有什么样的保证?以这种方式进行切片会以双倍的步长返回
a
中的数据视图,因此它需要恒定的时间,并且产生的开销非常小。@jme我只是想知道最快的协议是什么,因为我正在处理一个涉及采样大数据的时间受限问题。@d0rmLife:不,切片是恒定的时间。复制一个片段不是固定的时间,但你通常不需要复制。不,我不会投反对票。链接到的问题是“这创建了原始数据的视图,所以它是恒定时间。”下面它讨论复制切片,这是线性时间。但如果你不复制,就不需要线性时间。你可以很容易地用一个简单的
%%timeit
来验证这个声明。它不是ω(n/步)?计算成本是
O(1)
。基本切片返回一个步长改变的视图。根本不需要查看阵列。返回一个步长改变的视图需要O(1)成本吗?@juankirr是的。返回视图只是创建一个指针,即
O(1)
。更改步幅也是
O(1)
,因为它只是更新一个数字。你可以确定时间来确定。。。在我的机器上,
b=a[::2]
大约需要280纳秒,无论
a
有100个条目还是1亿个条目。
n = length(a)