Numpy 배열에서 곱셈
저는 2D 배열의 각 항에 1D 배열의 해당 항을 곱하려고 합니다.Numpy에 표시된 것처럼 모든 열에 1D 배열을 곱하고 싶다면 매우 쉽습니다.곱셈 함수하지만 저는 반대로 행에 있는 각 항을 곱하고 싶습니다.다시 말해서, 저는 다음을 곱하고 싶습니다.
[1,2,3] [0]
[4,5,6] * [1]
[7,8,9] [2]
그리고 구함
[0,0,0]
[4,5,6]
[14,16,18]
하지만 대신에 나는.
[0,2,6]
[0,5,12]
[0,8,18]
바보 같은 짓을 할 수 있는 우아한 방법이 있는지 아는 사람?정말 고마워, 알렉스
당신이 보여준 것과 같은 정규 곱셈:
>>> import numpy as np
>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> c = np.array([0,1,2])
>>> m * c
array([[ 0, 2, 6],
[ 0, 5, 12],
[ 0, 8, 18]])
축을 추가하면 원하는 방식으로 증가합니다.
>>> m * c[:, np.newaxis]
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
다음과 같이 두 번 전치할 수도 있습니다.
>>> (m.T * c).T
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
여러 가지 속도 옵션을 비교해 본 결과 놀랍게도 모든 옵션이diag
)도 마찬가지로 빠릅니다.개인적으로 사용합니다.
A * b[:, None]
(또는)(A.T * b).T
짧기 때문입니다.
그림을 재현하는 코드:
import numpy
import perfplot
def newaxis(data):
A, b = data
return A * b[:, numpy.newaxis]
def none(data):
A, b = data
return A * b[:, None]
def double_transpose(data):
A, b = data
return (A.T * b).T
def double_transpose_contiguous(data):
A, b = data
return numpy.ascontiguousarray((A.T * b).T)
def diag_dot(data):
A, b = data
return numpy.dot(numpy.diag(b), A)
def einsum(data):
A, b = data
return numpy.einsum("ij,i->ij", A, b)
perfplot.save(
"p.png",
setup=lambda n: (numpy.random.rand(n, n), numpy.random.rand(n)),
kernels=[
newaxis,
none,
double_transpose,
double_transpose_contiguous,
diag_dot,
einsum,
],
n_range=[2 ** k for k in range(13)],
xlabel="len(A), len(b)",
)
행렬 곱셈(일명 도트 곱)을 사용할 수도 있습니다.
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [0,1,2]
c = numpy.diag(b)
numpy.dot(c,a)
어느 것이 더 우아한지는 아마도 취향의 문제일 것입니다.
또 다른 트릭(v1.6 기준)
A=np.arange(1,10).reshape(3,3)
b=np.arange(3)
np.einsum('ij,i->ij',A,b)
저는 바보 같은 방송에 능숙합니다.newaxis
), 하지만 저는 여전히 이 새로운 것을 피하는 방법을 찾고 있습니다.einsum
도구입니다. 그래서 저는 이 해결책을 찾기 위해 약간의 시간을 보냈습니다.
시간(Ipython time it 사용):
einsum: 4.9 micro
transpose: 8.1 micro
newaxis: 8.35 micro
dot-diag: 10.5 micro
덧붙여서, 변경하는 것은i
로.j
,np.einsum('ij,j->ij',A,b)
알렉스가 원하지 않는 매트릭스를 만들어냅니다.np.einsum('ji,j->ji',A,b)
사실상, 이중 전치를 합니다.
구글에서 잃어버린 영혼들을 위해, 사용.numpy.expand_dims
그리고나서numpy.repeat
는 작동하며, 고차원적인 경우에도 작동합니다(즉, 형상(10, 12, 3)에 a를 곱한 경우).
>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6],[7,8,9]])
>>> b = numpy.array([0,1,2])
>>> b0 = numpy.expand_dims(b, axis = 0)
>>> b0 = numpy.repeat(b0, a.shape[0], axis = 0)
>>> b1 = numpy.expand_dims(b, axis = 1)
>>> b1 = numpy.repeat(b1, a.shape[1], axis = 1)
>>> a*b0
array([[ 0, 2, 6],
[ 0, 5, 12],
[ 0, 8, 18]])
>>> a*b1
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
행 배열을 열 배열로 변환해야 하지만, 전치는 그렇지 않습니다.대신 모양 바꾸기 사용:
>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> b = np.array([0,1,2])
>>> a * b
array([[ 0, 2, 6],
[ 0, 5, 12],
[ 0, 8, 18]])
모양 변경:
>>> a * b.reshape(-1,1)
array([[ 0, 0, 0],
[ 4, 5, 6],
[14, 16, 18]])
그냥 하는 게 어때요?
>>> m = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> c = np.array([0,1,2])
>>> (m.T * c).T
??
언급URL : https://stackoverflow.com/questions/18522216/multiplying-across-in-a-numpy-array
'programing' 카테고리의 다른 글
주입된 모의 객체의 메서드에 전달된 인수를 Mockito가 캡처하는 방법은 무엇입니까? (0) | 2023.07.29 |
---|---|
열려 있는 파일에서 read()를 두 번 호출할 수 없는 이유는 무엇입니까? (0) | 2023.07.29 |
단일 Flexbox 항목을 정당화하는 방법(정당화 내용 재정의) (0) | 2023.07.29 |
스프링 부트에 포함된 JarScan intomcat의 scanManifest 사용 안 함 (0) | 2023.07.29 |
HTML5 로컬 저장소 키 가져오기 (0) | 2023.07.29 |