#python #list #numpy
#питон #Список #numpy #python
Вопрос:
Отлично работает с использованием одного элемента / переменной
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'
Комментарии:
1.
math.sin
работает только со скалярами, одиночными значениями.np.sin
работает с массивом.2. спасибо , Пауль . как мне преобразовать строку ниже для работы с массивами? newT = interp(t , [minVal, maxVal],[0,1]) и значение = math.sin (newT * math.pi / 2)
Ответ №1:
Единственное, что нужно изменить, это создать 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 ]
(РЕДАКТИРОВАТЬ)
Похоже, что вы можете захотеть, чтобы 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
подход выполняет намного больше вычислений, чем действительно необходимо для решения этой проблемы, но в вашем случае это может быть не проблемой.
Комментарии:
1. Большое спасибо, могут ли minVal и MaxVal также быть массивом? В моем случае оба являются массивами . Когда я использую массивы для этих значений… Я получаю сообщение об ошибке. Как я могу это найти?
2. minVal и maxVal не могут быть массивами в
interp()
. Предположим, что они были, однако, правильно ли я понимаю, что вы хотите, чтобы они былиt[0]
интерполированы в[minVal[0], maxVal[0]]
иt[1]
должны быть интерполированы в[minVal[1], maxVal[1]]
etc.? Вы могли бы сделать что-то подобное сscipy.interpolate.interp2d()
, которое создает функцию, которая интерполирует в двух измерениях.3. Спасибо Саймону за то, что поделился своими знаниями, ваше понимание было идеальным, и это оказало огромную помощь. Не могли бы вы пролить больше света на то, как я мог бы использовать scipy для выполнения того же самого… должен ли я все переписывать в scipy? Если это не слишком сложно и отнимает много времени, не могли бы вы помочь с этим?
4. Спасибо, Саймон .. это идеально! Спасибо за помощь
5. @Josh: С удовольствием. Если какой-либо ответ соответствует вашим потребностям, вы можете «отметить» его, чтобы показать, что вы приняли ответ и / или проголосовали за него.
Ответ №2:
Я бы написал функцию для перебора этих списков и предоставления вам значений.
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
Комментарии:
1. Спасибо, я могу выполнять итерации по списку, но поскольку numpy может работать со списками, хотелось бы использовать скорость numpy, а не перебирать большие списки. Предпочел бы использовать numpy для работы со всем списком, а не перебирать элемент за элементом списка