Skip to main content
 首页 » 编程设计

python之从长 numpy 数组中保留一个元素超过两个元素的最快方法

2025年05月04日14dflying

让我们考虑一个 numpy 数组

a = array([1,2,25,13,10,9,4,5]) 

包含偶数个元素。 我只需要每两个随机保留一个数组元素: 第一个或第二个,然后是第三个或第四个,依此类推。 例如,使用 a,结果应该是:

c =  array([1,13,9,5]) 
d = array([2,13,10,4]) 
e = array([2,25,10,5]) 

我必须在包含数百个元素的长数组和沿着巨大循环的数千个数组上执行此操作。使用 pair_index+random.randint(0,1) 迭代元素并保持或删除一对二的最快算法是什么 一种每三个、四个等保留一个元素的通用方法会很好;-) 谢谢

结果:

import timeit 
import numpy 
 
def soluce1(): 
    k=2 
    a = numpy.array([1,2,25,13,10,9,4,5]) 
    aa = a.reshape(-1, k) 
    i = numpy.random.randint(k, size = aa.shape[0]) 
    return numpy.choose(i, aa.T) 
def soluce2(): 
    k=2 
    a = numpy.array([1,2,25,13,10,9,4,5]) 
    w = len(a) // k 
    i = numpy.random.randint(0, 2, w) + numpy.arange(0, 2 * w, 2)  
    return a[i] 
def random_skip(): 
    a= numpy.array([1,2,25,13,10,9,4,5]) 
    k=2 
    idx = numpy.arange(0, len(a), k) 
    idx += numpy.random.randint(k, size=len(idx)) 
    idx = numpy.clip(idx, 0, len(a)-1) 
    return a[idx] 
 
 
>     ts1=timeit.timeit(stmt='soluce1()',setup='from __main__ import soluce1',number=10000) 
> --> 161 µs 
>     ts2=timeit.timeit(stmt='soluce2()',setup='from __main__ import soluce2',number=10000) 
> --> 159 µs 
>     ts3=timeit.timeit(stmt='random_skip()',setup='from __main__ import random_skip',number=10000) 
> --> 166 µs 

似乎是等效的建议。再次感谢大家。

请您参考如下方法:

您可以使用花式索引选择元素,a[idx]:

def random_skip(a, skipsize=2): 
    idx = np.arange(0, len(a), skipsize) 
    idx += np.random.randint(skipsize, size=len(idx)) 
    idx = np.clip(idx, 0, len(a)-1) 
    return a[idx]     
 
 
In [141]: a = array([1,2,25,13,10,9,4,5])         
In [142]: random_skip(a) 
Out[142]: array([ 1, 13,  9,  4]) 
 
In [143]: random_skip(a, skipsize=3) 
Out[143]: array([1, 9, 5]) 
 
In [144]: random_skip(a, skipsize=4) 
Out[144]: array([ 1, 10]) 

idx = np.arange(0, len(a), skipsize) 选择每组中的第一项。

idx += np.random.randint(skipsize, size=len(idx)) 将索引随机分配给每组中的某些项目。

idx = np.clip(idx, 0, len(a)-1) 防止索引越界,以防 skipsize 不是 长度的倍数一个。