Python 我如何转换它,使numpy一次在整个列表上工作?
使用单个元素/变量可以正常工作Python 我如何转换它,使numpy一次在整个列表上工作?,python,list,numpy,Python,List,Numpy,使用单个元素/变量可以正常工作 import math import numpy as np from numpy import interp 适用于单个值 t = 25 minVal = 0 maxVal = 100 使用numpy将范围从0到100更改为0到1 newT = interp(t ,[minVal,maxVal],[0,1]) print newT value = math.sin(newT * math.pi / 2) print value,'value' &
import math
import numpy as np
from numpy import interp
适用于单个值
t = 25
minVal = 0
maxVal = 100
使用numpy将范围从0到100更改为0到1
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在整个列表上运行
t= [25,25,25]
minVal = [0,0,0]
maxVal = [100,100,100]
converedMinVal = [0,0,0]
converedMaxVal = [1,1,1]
现在要同时对列表进行操作。我无法让下面的线路工作。如何在整个列表上使用interp?我如何计算整个列表
t= [25,25,25]
minVal = [0,0,0]
maxVal = [100,100,100]
converedMinVal = [0,0,0]
converedMaxVal = [1,1,1]
使用numpy将范围从0到100更改为0到1
newT = interp(t ,[minVal,maxVal],[converedMinVal,converedMaxVal])
value = math.sin(newT * math.pi / 2)
print value,'value'
我将编写一个函数来遍历这些列表,并向您提供值
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
我将编写一个函数来遍历这些列表,并向您提供值
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
唯一需要更改的是使
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
方法所做的计算比解决这个问题所需要的要多得多,但这在您的情况下可能不是问题 唯一需要更改的是使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
方法所做的计算比解决这个问题所需要的要多得多,但这在您的情况下可能不是问题 math.sin
仅适用于标量和单值np.sin
与数组一起工作。谢谢Jpaulj。如何将下面的行转换为使用数组?newT=interp(t[minVal,maxVal],[0,1]),value=math.sin(newT*math.pi/2)math.sin
仅适用于标量和单个值np.sin
与数组一起工作。谢谢Jpaulj。如何将下面的行转换为使用数组?newT=interp(t[minVal,maxVal],[0,1])和value=math.sin(newT*math.pi/2)谢谢,我可以遍历列表,但是因为numpy可以处理列表,所以我希望使用numpy的速度,而不是遍历大列表。我更愿意使用numpy来处理整个列表,而不是逐项迭代列表谢谢,我可以迭代列表,但由于numpy可以处理列表,我希望使用numpy的速度,而不是迭代大型列表。更愿意使用numpy处理整个列表,而不是逐项遍历列表。非常感谢,minVal和MaxVal也可以是数组吗?在我的例子中,两者都是数组。当我对这些值使用数组时。。。我犯了一个错误。我怎样才能找到它?minVal和maxVal不能是interp()
中的数组。但是,假设它们是,我是否正确理解您希望t[0]
插入[minVal[0],maxVal[0]]
并t[1]
插入[minVal[1],maxVal[1]]
等。?你可以用scipy.interpolate.interp2d()
做类似的事情,它创建了一个二维插值函数。感谢Simon分享你的知识,你的理解非常完美,这是一个巨大的帮助。你能告诉我如何使用scipy做同样的事情吗。。。我必须用scipy重写所有内容吗?如果不太复杂,也不太费时,你能帮忙吗?谢谢西蒙。。太好了!谢谢你的邀请help@Josh:不客气。如果任何答案满足您的需要,您可以“勾选”它以表明您已接受答案和/或对其进行投票。非常感谢,minVal和MaxVal也可以是数组吗?在我的例子中,两者都是数组。当我对这些值使用数组时。。。我犯了一个错误。我怎样才能找到它?minVal和maxVal不能是interp()
中的数组。但是,假设它们是,我是否正确理解您希望t[0]
插入[minVal[0],maxVal[0]]
并t[1]
插入[minVal[1],maxVal[1]]
等。?你可以用scipy.interpolate.interp2d()
做类似的事情,它创建了一个二维插值函数。感谢Simon分享你的知识,你的理解非常完美,这是一个巨大的帮助。你能告诉我如何使用scipy做同样的事情吗。。。我必须重写sc中的所有内容吗