Mam tę funkcję, aby wektyzować:

if x >= y, then x*y
else x/y

Mój kod to:

def vector_function(x, y):

    if y >= x:
      return x*y
    else:
      return x/y
  
    vfunc = np.vectorize(vector_function)
    return vfunc
    
  raise NotImplementedError

Ale otrzymuję błąd:

'>=' not supported between instances of 'int' and 'list'

Czy ktoś może mi pomóc?

-1
Yudhisteer Chintaram 13 luty 2021, 14:29

2 odpowiedzi

Najlepsza odpowiedź

Problemem jest vectorize - Call w funkcji .

import numpy as np

# first define the function
def vector_function(x, y):
    if y >= x:
        return x * y
    else:
        return x / y

# vectorize it
vfunc = np.vectorize(vector_function)

# validation
print(vfunc([1, 2, 3, 4], 2.5)) # [2.5 5.  1.2 1.6]

Należy jednak pamiętać, od numpy.Vectorize: Funkcja vectorize zapewnia przede wszystkim dla wygody, nie do wydajności. Wdrożenie jest zasadniczo a do pętli.

1
Stefan B 9 marzec 2021, 15:17

Czysta wersja "Vectorized" to:

def foo(x,y):
    return np.where(y>=x, x*y, x/y)

In [317]: foo(np.array([1,2,3,4]), 2.5)
Out[317]: array([2.5, 5. , 1.2, 1.6])

W zależności od wielkości tablicy, w tym czasie 2 do 10X szybciej niż Stefans Odpowiedz

Wybrałem podejście where, ponieważ był to najłatwiejszy i najbardziej kompaktowy sposób nadawania x za pomocą y. Może nie być najszybszy, w zależności od "kosztu" / i *.

1
hpaulj 13 luty 2021, 20:11