Numpy: Как применить различные формулы в массиве на основе их значений (если elif elif ... еще для numpy)? - PullRequest
1 голос
/ 26 марта 2020

У меня есть numpy массив чисел x и некоторые пороги [A,B,C,D]

Я хочу применить 5 различных формул к каждому срезу массива, но в идеале я не хочу перебрать его (вот почему я пытаюсь использовать numpy).

Какой лучший способ сделать это? Это то, что я пытаюсь сделать, есть ли лучший способ?

cond_A = np.where(x <= A)
cond_B = np.where((x > A) & (x <= B))
cond_C = np.where((x > B) & (x <= C))
cond_D = np.where((x > C) & (x <= D))
cond_E =np.where(x > D)

x[cond_A] = function_A(x[cond_A])
...
...
x[cond_E]= function_E(x[cond_E])

РЕДАКТИРОВАТЬ: Если я пытаюсь это сделать, я получаю ошибку:

ValueError: The Истинное значение массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Вы должны использовать функцию intersect1d из numpy, чтобы применить несколько фильтров. Вот один пример с выводом в комментариях, надеюсь, это поможет

import numpy as np

def function(x):
    return x+10

a = np.arange(10)
print(a) # [0 1 2 3 4 5 6 7 8 9]

mask = np.intersect1d(np.where(a>3), np.where(a<6))
a[mask] = function(a[mask])
print(a) # [ 0  1  2  3 14 15  6  7  8  9]
0 голосов
/ 26 марта 2020

& - это оператор bitwise and, я полагаю, что вы используете and, поскольку именно тогда возникает ваша сообщенная ошибка.

Если вы хотите манипулировать массивами таким образом, используйте такие концепции функционального программирования, как карта и фильтр или список понимания поможет вам. Другой ответ использовал numpy функции, вот ответ с использованием списка:

x = [function_A(i) if cond_A else i for i in myarray]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...