Как я могу линейно растянуть массив до большего размера, используя NumPy? - PullRequest
0 голосов
/ 05 ноября 2019

Я бы хотел растянуть растущий массив Numpy линейно на массиве большего размера

[2, 4, 6, 8, 10] до чего-то вроде: [1.25, 2.5, 3.75, 5, 6.25,7.5, 8.75, 10]

, но решение, которое может получить общий возрастающий вклад и все еще растянуть его, скажем, например:

[2, 4, 6, 7, 8, 10,20, 20, 20] и растянуть его линейно по массиву размером 20

Существует ли какая-либо существующая функция numpy или другой простой способ сделать это?

Отредактировано:

Iпостараюсь сделать мой вопрос более понятным

Я пытаюсь выровнять изображение. Как часть процесса, я использую гистограмму и кумулятивную гистограмму

при проверке кумулятивной гистограммы - мой первый уровень серого может не быть 0, а мой последний уровень серого может не быть MAX_VAL (255 в моем случае)Я хотел бы взять полученные значения (некоторый монотонно увеличивающийся массив) и растянуть их так, чтобы мой первый уровень серого был бы 0, а моим последним был бы MAX_VAL.

Я думал об обрезке массива с помощью [первый уровень серого: последний уровень серого], а затем попытаться растянуть его до исходного размера (в моем случае 256), но я, похоже, не понимаю, как это сделать

заранее спасибо

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Как это?

your_array = np.array([2,4,6,8,10])
streched_array = np.linspace(np.min(your_array),np.max(your_array),20)
0 голосов
/ 05 ноября 2019

Вопрос, кажется, использует «растяжение» в двух смыслах. 1) перевести значения в массиве в заданный диапазон. 2) Расширить массив до большего массива.

Версия 1. a -> от 0 до 255. Без изменения размера.

def translate(x, mx):
    lo = x.min()
    rng = x.max()-lo
    return (x-lo)*mx/rng

a =np.array([10, 15,16,20, 25, 125, 126, 130, 150, 200, 201., 202])

at = translate(a,255.)
print(at)
# array([  0.      ,   6.640625,   7.96875 ,  13.28125 ,  19.921875,
#        152.734375, 154.0625  , 159.375   , 185.9375  , 252.34375 ,
#        253.671875, 255.      ])

Массив a остается того же размера, нозначения растягиваются, чтобы заполнить диапазон от 0 до 255.

Версия 2

x = np.arange(len(a)) # An independent x for each a (or at)
new_x = np.linspace( 0., 11., 24)  # Make the result have 25 elements, from 11.
print(new_x)
# [ 0.          0.47826087  0.95652174  1.43478261  1.91304348  2.39130435
#   2.86956522  3.34782609  3.82608696  4.30434783  4.7826087   5.26086957
#   5.73913043  6.2173913   6.69565217  7.17391304  7.65217391  8.13043478
#   8.60869565  9.08695652  9.56521739 10.04347826 10.52173913 11.        ]

Используйте new_x для интерполяции значений a (или at) на основе x

np.interp(new_x, x, at) # The array at is made longer (25 elements) 
# array([  0.        ,   3.17595109,   6.35190217,   7.21807065,
#          7.85326087,  10.04755435,  12.58831522,  15.59103261,
#         18.7669837 ,  60.34307065, 123.86209239, 153.08084239,
#        153.71603261, 155.2173913 , 157.75815217, 163.99456522,
#        176.69836957, 194.59918478, 226.35869565, 252.45923913,
#        253.09442935, 253.72961957, 254.36480978, 255.        ])

np.interp(new_x, x, a) # The original array a is made longer (25 elements) 
# array([ 10.        ,  12.39130435,  14.7826087 ,  15.43478261,
#         15.91304348,  17.56521739,  19.47826087,  21.73913043,
#         24.13043478,  55.43478261, 103.26086957, 125.26086957,
#        125.73913043, 126.86956522, 128.7826087 , 133.47826087,
#        143.04347826, 156.52173913, 180.43478261, 200.08695652,
#        200.56521739, 201.04347826, 201.52173913, 202.        ])

Я не уверен, что любой ответ отвечает на вопрос, но это два способа, которыми я могу его интерпретировать.

...