Python троичный, если на numpy массив с условием на значения ячейки массива - PullRequest
0 голосов
/ 01 мая 2020

У меня есть условная функция, скажем, f(x), которая берет значения домена из numpy .ndarray the_array и отображает в другой numpy .ndarray, result

f(x) =  g(x) if x>0
    h(x) otherwise

g(x) и h(x) вот некоторые другие функции.

Похоже, что-то вроде следующего, но я не знаю, как ссылаться на соответствующие записи массива в троичной, если:

result = g(the_array) if <??> else h(the_array) 

Ответы [ 4 ]

1 голос
/ 01 мая 2020

Если нет проблем с оценкой g(x) и h(x) для всех x, тогда

result = np.where( x>0, g(x), h(x))

Если g можно оценить только на x>0, мы должны сделать больше Работа. Например:

mask = x>0
result = h(x)
result[mask] = g(x[mask])

Некоторые ufunc принимают параметры where и out, которые работают следующим образом. Если g является ufunc:

g(x, where=x>0, out = h(x))
1 голос
/ 01 мая 2020

вы можете использовать эту основанную на массиве операцию, предполагая, что ваши функции g и h могут принимать все значения в качестве входных (то есть g не из-за ошибки / исключения для неположительных значений и h для положительных значений) , Уравнение самоочевидно для рассматриваемого оператора if:

result = g(x)*(x>0) + h(x)*(x<=0)

И если ваша функция g принимает только положительные значения, а функция h принимает только неположительные, вы можете замаскировать массив x и выполняйте операции и объединяйте их следующим образом:

idx_p = np.argwhere(x>0)
idx_np = np.argwhere(x<=0)
result = np.zeros_like(x)
result[idx_p] = g(x[x>0].reshape(-1, 1))
result[idx_np] = h(x[x<=0].reshape(-1, 1))

пример кода:

x = np.array([-1,1,-2,2])
def g(x):
  return x**2
def h(x):
  return x
result = g(x)*(x>0) + h(x)*(x<=0)

вывод:

[-1  1 -2  4]
1 голос
/ 01 мая 2020
result = the_array
for i in range(len(the_array)):
    result[i] = g(the_array[i]) if the_array[i] > 0 else h(the_array[i])
0 голосов
/ 01 мая 2020

Пока ваша функция быстро оценивается, вы можете использовать numpy.where:

import numpy as np

def g(x):
    return x * 2

def h(x):
    return x * 10

x = np.arange(-5, 5)

result = np.where(x > 0, g(x), h(x))

После этого result равно

array([-50, -40, -30, -20, -10,   0,   2,   4,   6,   8])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...