【问题标题】:How do I loop through an array python with apply?如何使用apply循环遍历数组python?
【发布时间】:2018-10-19 23:45:50
【问题描述】:

我的问题是,如何在不使用多个 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)

我该如何使用它?我正在尝试使用一个功能。 ..................................................... .

【问题讨论】:

  • 我有正确的输出,我要求一个更好的选择:使其具有响应性(或最大使用 for 循环)。
  • 如何使用例如 lambda 函数?
  • @Adath 最好将您的问题集中在您最初提出的问题上。我不确定你是否需要一个 lambda。 “最接近的 vq 值”是什么意思?
  • 例如sample数组的第一个元素是0.1,在vq数组中最接近的值是0.5,所以应该出现0.5。
  • 我只想使用一个for循环来循环遍历样本数组

标签: python arrays loops numpy for-loop


【解决方案1】:

您是否正在寻找类似(列表理解中的 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])

【讨论】:

  • 有办法不使用for吗?
  • 根据您的问题,没有“超过 1 个 for 循环”,但是可以,但您只是通过模块调用隐藏了 for 循环,请参阅更新。
  • 不要用vectorize 隐藏一个简单的循环。这是一种不好的做法。
  • 同意,也许我在上面的评论中不够清楚。
【解决方案2】:

可以用 lambda 代替 for 吗?

【讨论】:

  • 是的。这就是我要说的。
  • lambda有什么用?这只是定义函数的一种方式。您可以将它与map 一起使用,但这是一个语法不同的循环。
【解决方案3】:

假设“最接近”的值,您可以考虑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]

【讨论】:

    【解决方案4】:

    您根本不需要循环。首先观察您可以通过与vd 中的值进行比较来找到vq 中最接近的值。例如,如果样本介于 -10 之间,则该样本将最接近 -0.5。 由于vqvd 已排序,您可以使用恰当命名的searchsorted 方法来搜索vd 中样本适合的索引。应用于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])
    

    技术说明:在应用 searchsorted 之前,从 vd 中删除最后一个元素很有用,因为它不在 vq 的值之间。如果没有这种预防措施,样本 > 2 将产生超出范围的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      相关资源
      最近更新 更多