Вставка вычисленных значений между последовательными значениями в массив

#python #arrays #numpy

Вопрос:

Допустим, у меня есть простой массив, подобный этому:

 import numpy as np
a = np.array([1,2,3])
 

Что возвращает меня, очевидно:

 array([1, 2, 3])
 

Я пытаюсь добавить вычисленные значения между последовательными значениями в этом массиве. Расчет должен возвращать мне n значения с равным расстоянием между его границами.

Чтобы выразить себя в цифрах, предположим, я хочу добавить 1 значение между каждой парой последовательных значений, поэтому функция должна вернуть мне массив, подобный этому:

 array([1, 1.5, 2, 2.5, 3])
 

Другой пример, теперь со 2 значениями между каждой парой:

 array([1, 1.33, 1.66, 2, 2.33, 2.66, 3])
 

Я знаю логику и могу создать себе функцию, которая будет выполнять эту работу, но я чувствую, что у numpy есть определенные функции, которые сделали бы мой код намного чище!

Ответ №1:

Если ваш массив является

 import numpy as np

n = 2
a = np.array([1,2,5])

new_size = a.size   (a.size - 1) * n

x = np.linspace(a.min(), a.max(), new_size)
xp = np.linspace(a.min(), a.max(), a.size)
fp = a
result = np.interp(x, xp, fp)
 

ВОЗВРАТ: array([1. , 1.33333333, 1.66666667, 2. , 2.66666667, 3.33333333, 4. ])

Если ваш массив всегда расположен равномерно, вы можете просто использовать

 new_size = a.size   (a.size - 1) * n
result = np.linspace(a.min(), a.max(), new_size)
 

Комментарии:

1. Фантастика! Ты даже предсказал проблему, о которой я не знал, что у меня есть

Ответ №2:

Использование linspace должно помочь:

 
a = np.array([1,2,3])
n = 1

temps = []

for i in range(1, len(a)):
    temps.append(np.linspace(a[i-1], a[i], num=n 1, endpoint=False))

# Add last final ending point
temps.append(np.array([a[-1]]))
new_a = np.concatenate(temps)
print(new_a)
 

Ответ №3:

Попробуйте с np.arange :

 a = np.array([1,2,3])
n = 2
print(np.arange(a.min(), a.max(), 1 / (n   1)))
 

Выход:

 [1.         1.33333333 1.66666667 2.         2.33333333 2.66666667]