如何使用apply遍历数组python?

时间:2018-10-19 23:45:51

标签: python arrays loops numpy for-loop

我的问题是,如何在不使用多个for循环的情况下做到这一点?


#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)

我怎么使用它?我正在尝试使用一个功能。 ...................................................

4 个答案:

答案 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。 对vqvd进行排序后,您可以使用恰当命名的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的样本将产生越界指数。