Как мне преобразовать это так, чтобы numpy работал по всему списку за раз? - PullRequest
1 голос
/ 06 марта 2019

Работает нормально, используя один элемент / переменную

import math
import numpy as np
from numpy import interp  

Работает нормально для одного значения

t = 25
minVal = 0
maxVal = 100

Измените диапазон с 0 на 100 на 0 на 1, используя numpy

newT = interp(t ,[minVal,maxVal],[0,1])  
print newT

value =  math.sin(newT * math.pi / 2)
print value,'value'
>>0.25
>>0.382683432365 value

Приведенный выше код работал нормально и дал мне результат для одной переменной. Теперь я хочу, чтобы numpy делал то же самое, используя списки в качестве входных данных, поскольку numpy может работать со всем списком, как я использовал в других случаях. Как мне перевести вышеприведенную строку, чтобы заставить numpy работать со всем списком?

Теперь для одновременной работы со списком. Я не могу заставить строки ниже работать. Как я могу использовать interp во всех списках? Как мне сделать математику во всем списке?

t= [25,25,25]
minVal = [0,0,0]
maxVal = [100,100,100]

converedMinVal = [0,0,0]
converedMaxVal = [1,1,1]

Измените диапазон от 0 до 100 до 0 до 1, используя numpy

newT = interp(t ,[minVal,maxVal],[converedMinVal,converedMaxVal])  

value =  math.sin(newT * math.pi / 2)
print value,'value'

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Единственное, что нужно изменить, - это сделать t массивом и (как заметил @hpaulj) использовать np.sin() вместо math.sin(), например ::

import numpy as np
import math

t = [10,20,30]
minVal = 0
maxVal = 100
converedMinVal = 0
converedMaxVal = 1
newT = np.interp(t ,[minVal,maxVal],[converedMinVal,converedMaxVal]) 
value =  np.sin(newT * math.pi / 2)
print value

... для которого вывод:

[ 0.15643447  0.30901699  0.4539905 ]

(EDIT)

Похоже, вы можете захотеть интерполировать t[0] в [minVal[0], maxVal[0]] и интерполировать t[1] в [minVal[1], maxVal[1]] и т. Д. В этом случае вы можете использовать scipy.interpolate.interp2d(), который создает функцию, которая интерполирует в два измерения, например следующим образом:

import numpy as np
import scipy.interpolate as spi
import math

t= [10,20,30]
minVal = [0, 11, 15]
maxVal = [100, 200, 500]
x = list(range (len(t)))*2
y = minVal + maxVal
converedMinVal = [0, 2, 10]
converedMaxVal = [1, 8, 20]
z = converedMinVal + converedMaxVal

f = spi.interp2d(x, y, z) 
newT = np.diag(f(range(len(t)),t))
value =  np.sin(newT * math.pi / 2)
print value

Функция f() интерполирует во всех комбинациях своих двух векторных параметров и возвращает матрицу, поэтому, если вы хотите только интерполяцию в моменты времени в t, вам нужно взять диагональ этой матрицы, как я сделано здесь.

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

0 голосов
/ 06 марта 2019

Я бы написал функцию для перебора этих списков и предоставления вам значений.

def get_values(t_vals, minVals, maxVals):
    values = []
    for i in range(len(t_vals)):
        newT = interp(t_vals[i], [minVals[i], maxVals[i]], [0,1]) 
        value =  math.sin(newT * math.pi / 2)
        values += value
    return values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...