이 스레드에서,리스트 이해에서 튜플로 여러 리턴 값을 언 패하는 방법을 볼 수 있습니다.numpy 배열에 대한 다중 리턴 함수에 대한 파이썬리스트 이해율
def f(x):
return 2*x, x*x
x = range(1, 4)
xlist, ylist = zip(*[f(value) for value in x])
이렇게하면 numpy 배열로 바로 처리 할 수 있습니까? 아니면이 유일한 해결책은 다음과 같습니다.
?
이 스레드에서,리스트 이해에서 튜플로 여러 리턴 값을 언 패하는 방법을 볼 수 있습니다.numpy 배열에 대한 다중 리턴 함수에 대한 파이썬리스트 이해율
def f(x):
return 2*x, x*x
x = range(1, 4)
xlist, ylist = zip(*[f(value) for value in x])
이렇게하면 numpy 배열로 바로 처리 할 수 있습니까? 아니면이 유일한 해결책은 다음과 같습니다.
?
당신은 사용할 수 있습니다 :
xlist,ylist = np.fromiter(
itertools.chain.from_iterable(f(value) for value in x),
dtype=np.int_,
count=len(x)*2
).reshape((-1,2)).T
또는
xlist,ylist = np.array([f(value) for value in x]).T
그러나 다른 답변에서 제안한 것처럼 어레이에서 직접 작업하는 방식은보다 읽기 쉽고 빠를 수도 있습니다.
이렇게하려면 numpy.array
을 사용하여 간단히 인수를 배열 자체로 전달하십시오. 기능의 조작은 배열 인수에 매핑 얻을 두 개의 배열의 튜플이 반환됩니다
>>> xlist, ylist = f(np.asarray(x))
>>> xlist
array([2, 4, 6])
>>> ylist
array([1, 4, 9])
나는 그것을 알고있다. 그러나 이것은 단지 기본적인 예보다 더 광석이었다. 그래서 나는 아직도 그런 해결책에 관심이있다. 예 : 마지막 결과를 다음 반복의 입력으로 원하면 어떻게 될까요? 같은 NP로서 '수입 NumPy와 np.arange X = (10, 14) Y = [] t = 0 J, 난에 열거 (X)의 t = I + y.append (t) ' – Peterhack
@ Peterhack, 그럼 당신은 잘못된 질문을했습니다. –
그래서 나는 그것을 요구하지 않았다. 함수가 배열을 처리 할 수 있는지 여부와 관계없이이 작동 방식을보고 싶었습니다. 그 일을 분명히하지 않으면 죄송합니다. – Peterhack
zip
또는 목록 함축에 대한 필요가 없습니다. 당신은 또한 당신의 f
기능을 변경할 필요가 없습니다 : x
가 배열
>>> import numpy as np
>>> x = np.arange(1, 4)
>>> array1, array2 = f(x)
>>> array1
array([2, 4, 6])
>>> array2
array([1, 4, 9])
경우를 2 * x
는 x
의 각 요소는 2
곱한된다는 것을 의미합니다 :
>>> 2 * x
array([2, 4, 6])
배열을 처리 할 수없는 함수 사이에 무언가가 있다고 가정하면리스트의 이해가 가능할 것입니다. 맞습니까? 그래서 내가 그 일을 급히 찾고 있었다. – Peterhack
왜 첫 번째 솔루션이 두 배 빠른 속도입니까? – Peterhack
@Peterhack 확신하기 만하면 내가 제안한 다른 솔루션보다 더 빠르다는 의미입니까? 아마도 중간 목록을 만들지 않기 때문에 출력 배열은'count' 인수를 사용하여 미리 할당되고 생성기의 값을 사용하여 직접 채워집니다 (첫 번째 해결 방법에는 목록 이해가 없지만 생성자 표현식). – lukas