#Example:
#samples : [0.1, -0.3]
#return : [0.5, -0.5]
import numpy as np
vq = np.array([-1.5,-0.5,0.5,1.5])
vd = np.array([-1,0,1,2])
samples = [0.1,-0.3]
k = []
g = []
for t in range(len(vq)):
if(i[t] == True):
g.insert(t,vq[t])
k.append(g[0])
b = []
for n in range(len(samples)):
i = samples[n] < vd
b.append(i)
def v(e,m):
if(m == len(b)):
return k
if(b[m][e] == True):
k.append(vq[e])
return v(e,m+1)
else:
m = m - 1
return v(e+1,m)
我怎么使用它?我正在尝试使用一个功能。 ...................................................
答案 0 :(得分:2)
您是否正在寻找类似的东西(列表理解中的1个for循环):
In []:
[vq[np.where(vd > x)][0] for x in samples]
Out[]:
[0.5, -0.5]
没有for
循环(不推荐!!!):
In []:
np.vectorize(lambda x: vq[np.where(vd > x)][0])(samples)
Out[]:
array([ 0.5, -0.5])
答案 1 :(得分:0)
是否可以将其与lambda一起使用,而不是用于?
答案 2 :(得分:0)
假设“最接近”的值,您可以考虑使用abs
。
[vq[np.argmin(abs(j-vq))] for j in samples]
[0.5, -0.5]
因此您不需要lambda,但是如果您想知道它是如何工作的,或者您的问题更复杂,可以使用lambda进行相同的操作;
my_lambda = lambda x, y: [x[np.argmin(abs(j-x))] for j in y]
my_lambda (vq, samples)
[0.5, -0.5]
答案 3 :(得分:0)
您根本不需要循环。首先观察到您可以通过与vq
中的值进行比较来找到vd
中最接近的值。例如,如果样本在-0.5
和-1
之间,则它将最接近0
。
对vq
和vd
进行排序后,您可以使用恰当命名的searchsorted
方法在样本适合的vd
中搜索索引。这些索引应用于{{1 }}引用相应的最接近值:
vq
技术说明:在应用搜索排序之前,从>>> import numpy as np
>>>
>>> vq = np.array([-1.5,-0.5,0.5,1.5])
>>> vd = np.array([-1,0,1,2])
>>> samples = [0.1,-0.3]
>>>
>>> vq[vd[:-1].searchsorted(samples)]
array([ 0.5, -0.5])
删除最后一个元素很有用,因为它不在vd
的值之间。如果没有这种预防措施,> 2的样本将产生越界指数。