Как мне преобразовать это так, чтобы numpy работал со всем списком одновременно?

#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 для работы со всем списком, а не перебирать элемент за элементом списка