Вызов функции, содержащей массив значений x

#arrays #python-3.x #function #piecewise

#массивы #python-3.x #функция #кусочно

Вопрос:

Я хочу вызвать функцию в программе, которая имеет тот же формат, что и следующая, но где x значения представлены в виде массива shape = (426, 240) . Может кто-нибудь помочь с этим?

Функция:

 def f(x):
    if x < 0:
        return -2*x
    else :
        return -x

    x = np.arange(-100, 100, 1)

    plt.plot(x, list(map(f, x)), 'b-')  # for python3

    #plt.show()
 

кусочная функция

Часть кода, вызывающая функцию, будет выглядеть следующим образом:

 def nucleation_and_motion_in_G_gradient_fluid_2D(writer, args, R=60):
    dx = 2*R / args.height
    x = (np.arange(args.width) - args.width // 2) * dx
    y = (np.arange(args.height) - args.height // 2) * dx
    x, y = np.meshgrid(x, y, indexing='ij')

def source_G(t):
    center = np.exp(-0.5*(t-5)**2) * 10
    gradient = (1 np.tanh(t-30)) * 0.0003
    piecewise_1 = f(x) # ***function f(x) called here***

    return -( 
        np.exp(-0.5*(x*x   y*y)) #  np.exp(-0.5*((x)**2   y*y))
    ) * center   piecewise_1 * gradient   # piecewise function test
 

Основной код здесь.

Я уже знаю, что код работает для trapezoid функции в сочетании с x массивом следующим образом:

(код требует: from scipy import signal )

 def trapezoid_signal(x, width=2., slope=1., amp=10., offs=1):
        a = slope * width * signal.sawtooth(2 * np.pi * 1/10 * x/width - 0.8, width=0.5)/4.
        a[a>amp/2.] = amp/2.
        a[a<-amp/2.] = -amp/2.
        return a   amp/2.   offs

def source_G(t):
    center = np.exp(-0.5*(t-5)**2) * 10
    gradient = (1 np.tanh(t-30)) * 0.0003
    trapezoid = trapezoid_signal(x, width=40, slope=5, amp=50)

    return -( 
        np.exp(-0.5*(x**2   y**2)) 
    ) * center   trapezoid * gradient # one soliton particle in 2 dimensions of xy with z axis as concentration potential
 

Комментарии:

1. Поскольку я понятия не имею, как выглядит вызываемая вами функция, я могу только предложить предложение. Вызовите функцию с массивом в качестве переменной. Проблема в том, что ваша функция должна обрабатывать массив, а не однозначную переменную

2. @itprorh66, спасибо за совет! Функция f(x) вызывается с помощью piecewise_1 = f(x) .

Ответ №1:

Если вы хотите сделать это

 def f(x):
    if x < 0:
        return -2*x
    else :
        return -x
 

совместимый с векторизацией, вы можете использовать следующий (очень распространенный) трюк:

 def f(x):
    neg = x < 0
    return neg * (-2 * x)   (1 - neg) * -x
 

Это работает!

 >>> f(np.arange(-5, 5))
array([10,  8,  6,  4,  2,  0, -1, -2, -3, -4])
 

Комментарии:

1. Просто любопытно, поэлементное умножение с логическим значением быстрее, чем маскирование, или вы написали это так, чтобы уместить все в одной строке?

2. @PranavHosangadi Для такой простой операции, как эта, я действительно считаю, что это быстрее, чем маскировка.