Вот один способ с linspace
, а затем округлить их, чтобы получить места по длине, где нам нужно выбрать наши новые элементы, а затем просто индексировать во входном массиве, что даст нам требуемый результат -
def resize_down(a, newlen):
a = np.asarray(a)
return a[np.round(np.linspace(0,len(a)-1,newlen)).astype(int)]
Примеры прогонов -
In [23]: l # larger one than given sample
Out[23]: array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
In [24]: resize_down(l, 2)
Out[24]: array([ 1, 11])
In [25]: resize_down(l, 3)
Out[25]: array([ 1, 6, 11])
In [26]: resize_down(l, 4)
Out[26]: array([ 1, 4, 8, 11])
In [27]: resize_down(l, 5)
Out[27]: array([ 1, 3, 6, 9, 11])
In [28]: resize_down(l, 6)
Out[28]: array([ 1, 3, 5, 7, 9, 11])
Синхронизация большого массива с 900000
элементами и изменение размера до 500000
-
In [43]: np.random.seed(0)
...: l = np.random.randint(0,1000,(900000))
# @jdehesa's soln
In [44]: %timeit resize_proportional(l, 500000)
10 loops, best of 3: 22.2 ms per loop
In [45]: %timeit resize_down(l, 500000)
100 loops, best of 3: 5.58 ms per loop