Pandas의 행렬 곱셈

Olorunfemi Akinlua 2023년6월21일
  1. 행렬의 곱셈
  2. Pandas에서 DataFrame이 정렬되어 있는지 확인
  3. 도트 기능을 사용하여 Pandas에서 행렬 곱셈 수행
Pandas의 행렬 곱셈

행렬 곱셈은 무엇보다도 네트워크 관계, 좌표계 변환, 숫자 모델링 및 재고 계산을 이해하는 데 널리 사용됩니다. 행-열 기반 수치 데이터를 사용하여 행렬 곱셈을 수행하고 적용 가능한 모든 영역에서 결과를 사용할 수 있습니다.

Pandas와 Numpy에는 곱셈, 반전 등과 같은 행렬 사용 및 연산을 가능하게 하는 도구와 기능이 있습니다. Pandas의 행렬 곱셈은 기본 수학을 모르면 다소 혼란스러울 수 있으며 오류가 발생할 수 있습니다.

이 기사에서는 pandas에서 행렬 곱셈을 수행하는 방법과 오류를 피하는 방법에 대해 설명합니다.

행렬의 곱셈

행렬의 곱셈을 수행하려면 관련된 두 행렬이 연산에 맞게 정렬(또는 적절)되도록 해야 합니다. 행렬에는 행과 열이 있습니다. 2개의 행렬을 곱하려는 경우 가능하려면 열과 행의 수가 중요합니다.

행렬을 로 설명합니다. 예를 들어 2 x 4 행렬에는 2 행과 4 열이 있습니다. 이 모든 정보와 함께 행렬 곱셈이 가능하려면 첫 번째 행렬(왼쪽 행렬)의 열 수가 두 번째 행렬(오른쪽 행렬)의 행 수와 같아야 합니다.

따라서 첫 번째 행렬에는 3개의 열이 있고 두 번째 행렬에는 3개의 행이 있기 때문에 2 x 3 행렬에 3 x 2를 곱할 수 있습니다. 또한 첫 번째 행렬의 열 수가 두 번째 행렬의 행 수인 4와 같기 때문에 3 x 4 행렬에 4 x 23 행렬을 곱할 수 있습니다.

그러나 어떤 행렬이 먼저인지 변경(또는 반전)하면 행렬 곱셈이 불가능할 수 있습니다. 이전과 동일한 예를 사용하여 첫 번째 열의 열 수가 두 번째 행렬의 행 수와 같기 때문에 3 x 2 행렬에 2 x 3 행렬을 곱할 수 있습니다.

두 번째 예의 경우 4 x 23 행렬에 3 x 4 행렬을 곱할 수 있습니다. 첫 번째 행렬의 열 수(23)가 행 수(3)와 같지 않기 때문입니다. 두 번째 매트릭스의

Pandas에서 DataFrame이 정렬되어 있는지 확인

데이터 프레임(행렬)의 모양이 행렬 곱셈에 대해 명시된 규칙에 맞는지 확인하여 가지고 있는 데이터 프레임이 행렬 연산을 수행할 수 있는지 확인할 수 있습니다. 이를 달성하기 위해 데이터 프레임의 shape 속성(두 요소가 있는 튜플)에 액세스하고 첫 번째 데이터 프레임(매트릭스)의 열 값(튜플 내의 두 번째 값)을 행 값(첫 번째 값)과 비교합니다. 두 번째 데이터 프레임(매트릭스)에 대한 튜플 내).

dfother라는 두 개의 데이터 프레임을 만들고 모양을 확인하고 비교해 봅시다.

암호:

import pandas as pd
import numpy as np

df = pd.DataFrame([[23, 33], [33, 41]])
other = pd.DataFrame([[31, 0], [20, 1]])

print(df)
print(other)

출력:

    0   1
0  23  33
1  33  41

    0  1
0  31  0
1  20  1

이제 모양을 확인하고 데이터 프레임이 행렬 곱셈 계산을 수행할 수 있는지 비교해 봅시다.

print(df.shape)
print(other.shape)

if df.shape[1] == other.shape[0]:
    print("DataFrames (matrices) align and therefore matrix multiplication possible.")
else:
    print(
        "DataFrames (matrices) don't align and therefore matrix multiplication not possible."
    )

출력:

(2, 2)
(2, 2)
DataFrames (matrices) align and therefore matrix multiplication is possible.

보시다시피 df의 열 수가 other의 행과 같기 때문에 데이터 프레임이 정렬됩니다. 이제 행렬 곱셈을 위해 설계된 함수 dot()를 사용할 수 있습니다.

도트 기능을 사용하여 Pandas에서 행렬 곱셈 수행

Pandas와 Numpy에는 행렬 곱셈에 사용할 수 있는 dot() 함수가 있습니다. 행렬 곱셈을 수행하는 방법을 보여주기 위해 두 가지를 모두 사용할 것입니다.

이전 섹션에서 생성한 데이터 프레임을 사용하여 dot() 함수를 사용하는 방법을 설명할 수 있습니다. dfother의 행렬 곱셈에 대해 알아봅시다.

pandas dot() 함수를 사용하여 함수가 첫 번째 행렬인 df에 적용되고 두 번째 행렬인 other가 아래와 같이 dot() 함수에 인수로 전달됩니다.

print(df.dot(other))

출력:

      0   1
0  1373  33
1  1843  41

numpy dot() 함수를 사용하려면 두 개의 인수(두 개의 행렬)를 전달하지만 첫 번째 행렬이 먼저 전달됩니다.

print(np.dot(df, other))

출력:

[[1373   33]
 [1843   41]]

numpy 라이브러리를 사용하여 임의로 생성된 df1df2라는 또 다른 두 개의 데이터 프레임으로 작업하고 두 dot() 함수를 사용하여 행렬 곱셈을 수행해 보겠습니다.

암호:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])
df2 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])

print(np.dot(df1, df2))
print(df1.dot(df2))

출력:

[[ 1.28220783 -1.36789201  0.16335459]
 [-0.8039172   0.87851003 -0.32282877]
 [ 1.09767978 -0.71870817 -0.23485835]]

-----
...
ValueError: matrices are not aligned

numpy 라이브러리를 사용하는 첫 번째 dot() 함수는 오류 없이 작동했지만 pandas 라이브러리를 사용하는 두 번째 dot() 함수는 ValueError: 행렬이 정렬되지 않음 오류 메시지를 제공하지 않았습니다.

이 오류 메시지가 나타나는 이유는 pandas dot() 함수가 실행될 때 df1df2를 다시 인덱싱하여 df1의 열 순서와 의 행(인덱스) 순서가 df2가 일치하지 않아 행렬이 잘못 정렬됩니다. Numpy dot() 함수는 많은 작업을 수행하지 않으며 오류가 없습니다.

이 오류를 처리하려면 두 번째 데이터 프레임(df2)의 인덱스를 첫 번째 데이터 프레임(df1)의 열에 할당하여 두 데이터 프레임을 정렬해야 합니다.

암호:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])
df2 = pd.DataFrame(np.random.randn(3, 3), columns=list("ABC"), index=[1, 2, 3])

print(np.dot(df1, df2))

df2.index = df1.columns
print(df1.dot(df2))

출력:

[[ 1.28220783 -1.36789201  0.16335459]
 [-0.8039172   0.87851003 -0.32282877]
 [ 1.09767978 -0.71870817 -0.23485835]]

          A         B         C
1  1.282208 -1.367892  0.163355
2 -0.803917  0.878510 -0.322829
3  1.097680 -0.718708 -0.234858

이제 우리는 오류가 없으며 두 행렬 곱셈 계산은 상관없이 작동합니다.

Olorunfemi Akinlua avatar Olorunfemi Akinlua avatar

Olorunfemi is a lover of technology and computers. In addition, I write technology and coding content for developers and hobbyists. When not working, I learn to design, among other things.

LinkedIn