Как мне пройти через массив Python с применить? - PullRequest
0 голосов
/ 20 октября 2018

Мой вопрос: как я могу сделать это, не используя более одного цикла 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 голосов
/ 20 октября 2018

Вам не нужен цикл вообще.Сначала обратите внимание, что вы можете найти ближайшее значение в vq, сравнивая со значениями в vd.Например, образец будет ближайшим к -0.5, если он находится между -1 и 0.Когда vq и vd отсортированы, вы можете использовать метко названный метод 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])

Техническое примечание: перед применением сортированного поиска полезно удалить последний элемент из vd, поскольку он не находится между значениями vq.Без этой меры предосторожности образец> 2 дал бы индекс за пределами допустимого.

0 голосов
/ 20 октября 2018

Может ли использовать его с лямбда, а не для?

0 голосов
/ 20 октября 2018

при условии «ближайшего» значения, вы можете рассмотреть abs.

[vq[np.argmin(abs(j-vq))] for j in samples]
[0.5, -0.5]

, чтобы вам не понадобилась лямбда, но если вы хотите знать, как она работает или, возможно, ваша проблема более сложнаята же операция с лямбдой:

my_lambda = lambda x, y: [x[np.argmin(abs(j-x))] for j in y]
my_lambda (vq, samples)
[0.5, -0.5]
0 голосов
/ 20 октября 2018

Вы ищете что-то вроде (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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...