인수, 범위 및 결과가 모두 numpy 배열 인 경우 upper_bound
및 lower_bound
함수가 반환하는 해당 값 사이에서 각 요소를 고정 할 수 있도록 몇 가지 배열 할당을 수행 할 수 있습니다. 핵심 부분은 다음과 같습니다
r = f(x)
l = lower_bound(x)
u = upper_bound(x)
i = r < l
j = r > u
r[i] = l
r[j] = u
i
및 j
인덱스는 각각 하부 및 상부 경계에 고정 될 필요가있는 말 부울 배열 될 것입니다. 데코레이터로이 코드가 작동하려면, 당신은과 같이 중첩 된 기능의 한 쌍의 내부에 넣어해야합니다
def clamp(f):
@functools.wraps(f)
def wrapper(x):
r = f(x)
l = lower_bound(x)
u = upper_bound(x)
i = r < l
j = r > u
r[i] = l
r[j] = u
return r
return wrapper
functools.wraps
가 장식 기능의 그것 때문에 래퍼 함수를 복사 이름, 주석 및 문서화 문자열을 만든다 .
위의 코드는 항상 동일한 upper_bound
및 lower_bound
기능을 사용한다고 가정합니다. 당신이 장식하고 다른 기능에 대한 사용자 정의 할 것과해야 할 경우, 중첩의 추가 레이어를 추가하고 이그나시오 바스케스 - 에이 브람스의 대답처럼 "장식 공장"을 정의 할 수 있습니다
def clamp(lower_bound, upper_bound): # this is the decorator factory function
def decotator(f): # this is the decorator function
@functools.wraps(f)
def wrapper(x): # this is the wrapper function
... # same code here as above
return r
return wrapper
return decorator
멋진 대답을! 이것은 훌륭하게 작동하며 단일 변수 인수에 대한 훌륭한 구문 템플릿이지만 numpy 배열에서는 작동하지 않습니다. 그 목적을 위해 구문을 흔들리는 방법을 알고 있습니까? – aph
NumPy 배열은 단일 인수입니다. * 특정 * 문제가 있습니까? –
문제가 인수가 아니라 반환 값으로 의심됩니다. 스칼라를 비교하는 것과 같은 방식으로 numpy 배열을 비교할 수 없다 ('all'을 사용해야하거나'l' 또는'u '를 반환하는 대신 범위를 벗어나는 값을 원소 단위로 바꾸기 위해) '). – Blckknght