Как пропорционально изменить размер массива до определенной длины? - PullRequest
5 голосов
/ 20 мая 2019

У меня есть массив длины n, и я хочу изменить его размер до определенной длины, сохраняя пропорции.

Мне нужна функция, подобная этой:

def rezise_my_array(array, new_lentgh)

Например,входом будет массив длины 9:

l = [1,2,3,4,5,6,7,8,9]

Если я уменьшу его длину до длины 5, будет выводиться:

[1,3,5,7,9]

или наоборот.

Это необходимо для создания модели линейной регрессии в pyspark, поскольку все объекты должны иметь одинаковую длину.

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Вот один способ с 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
2 голосов
/ 20 мая 2019

Вы можете сделать что-то вроде этого:

import numpy as np

def resize_proportional(arr, n):
    return np.interp(np.linspace(0, 1, n), np.linspace(0, 1, len(arr)), arr)

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(resize_proportional(arr, 5))
# [1. 3. 5. 7. 9.]

Результатом здесь является значение с плавающей запятой, но вы можете округлить или привести к целому числу, если вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...