안경잡이개발자

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    url = "https://movie.naver.com/movie/bi/mi/review.nhn?code=156464"
    soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser")

    ul = soup.find("ul", class_="rvw_list_area")
    for i in ul.find_all("li"):
        print(i.strong.get_text())

if __name__ == "__main__":
    main()



728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    soup = BeautifulSoup(urllib.request.urlopen("https://www.clien.net/service/group/community").read(), "html.parser")

    list_title = []
    list_nickname = []

    for i in soup.find_all("span", class_="subject_fixed"):
        list_title.append(i.get_text())

    for i in soup.find_all("span", class_="nickname"):
        list_nickname.append(i.get_text())

    print(list_title)
    print(list_nickname)

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  소스코드는 다음과 같습니다.


import urllib.request from bs4 import BeautifulSoup def main(): url = "http://www.kyeonggi.com/news/articleList.html?sc_section_code=S1N2&view_type=sm" soup = BeautifulSoup(urllib.request.urlopen(url).read(), "html.parser") list_title = [] list_content = []

# 기사 제목 파싱 for news_title in soup.find_all("div", class_="list-titles"): list_title.append(news_title.get_text())

# 기사 요약 파싱 for news_content in soup.find_all("p", class_="list-summary"): list_content.append(news_content.get_text()) print(list_title) print(list_content) if __name__ == "__main__": main()





728x90
반응형

728x90
반응형

  아래 소스코드를 이용하면 네이버 인기 검색어를 파싱할 수 있습니다. 왜냐하면 인기 검색어는 공통적으로 "ah_k"라는 클래스로 묶여 있기 때문입니다.


import urllib.request
from bs4 import BeautifulSoup

def main():
    sourcecode = urllib.request.urlopen("http://www.naver.com").read()
    soup = BeautifulSoup(sourcecode, "html.parser")
    list = []
    for naver_text in soup.find_all("span", class_="ah_k"):
        list.append(naver_text.get_text())
    print(list)

if __name__ == "__main__":
    main()


728x90
반응형

728x90
반응형

  파이썬(Python)의 Matplotlib 라이브러리는 선 그래프 말고도 정말 다양한 형태의 그래프를 지원합니다. 


※ 막대 그래프 ※


  막대 그래프틑 bar() 함수를 이용해서 그릴 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-9, 10)
plt.bar(x, x ** 2)
plt.show()


  누적 막대 그래프 형태도 사용할 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(10) # 아래 막대
y = np.random.rand(10) # 중간 막대
z = np.random.rand(10) # 위 막대
data = [x, y, z]
x_array = np.arange(10)
for i in range(0, 3): # 누적 막대의 종류가 3개
    plt.bar(
        x_array, # 0부터 10까지의 X 위치에서
        data[i], # 각 높이(10개)만큼 쌓음
        bottom=np.sum(data[:i], axis=0)
    )
plt.show()


※ 스캐터(Scatter) 그래프 ※


  이제 스캐터(Scatter) 그래프를 먼저 알아보도록 하겠습니다. 그래프를 그릴 때 3번째 인자로 마커의 종류를 입력하면, 알아서 스캐터 그래프로 인식합니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-9, 10)
y1 = x ** 2
y2 = -x
plt.plot(
    x, y1, "*",
    markersize=10,
    markerfacecolor="blue",
    markeredgecolor="red"
)
plt.show()


  혹은 바로 scatter() 함수를 이용해서 스캐터를 그릴 수 있습니다.


import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(10)
y = np.random.rand(10)
colors = np.random.randint(0, 100, 10)
sizes = np.pi * 1000 * np.random.rand(10)
plt.scatter(x, y, c=colors, s=sizes, alpha=0.7)
plt.show()


※ 히스토그램 그래프 ※


  히스토그램 그래프 또한 그릴 수 있습니다. 정규분포 그래프를 나타낼 때에도 많이 사용됩니다.


import matplotlib.pyplot as plt
import numpy as np

data = np.random.randn(10000)
plt.hist(data, bins=1000)
plt.show()


  이 때 bins 속성은 어느 정도 X 간격으로 히스토그램을 출력할 지를 설정하도록 해줍니다. 1000을 넘어서면 다소 그래픽 처리에 시간이 소요될 수 있습니다.

728x90
반응형

728x90
반응형

  파이썬(Python)에서 Matplotlib 라이브러리는 다양한 데이터를 시각화할 수 있도록 도와주는 라이브러리입니다.


  가장 간단한 예제로 (1, 1), (2, 2), (3, 3)을 선으로 잇는 그래프를 만들어보도록 하겠습니다.

import matplotlib.pyplot as plt x = [1, 2, 3] y = [1, 2, 3] plt.plot(x, y) plt.title("My Plot") plt.xlabel("X") plt.ylabel("Y") plt.show()


  그래프를 그림 형태로 저장하기 위해서는 plt.savefig(그림 파일) 명령어를 이용하여 저장할 수 있습니다. 또한 하나의 그림 파일에 여러 개의 그래프가 들어가도록 코딩을 할 수도 있습니다.


import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, np.pi * 10, 500) # PI * 10 넓이에, 500개의 점을 찍기 fig, axes = plt.subplots(2, 1) # 2개의 그래프가 들어가는 Figure 생성 axes[0].plot(x, np.sin(x)) # 첫 번째 그래프는 사인(Sin) 그래프 axes[1].plot(x, np.cos(x)) # 두 번째 그래프는 코사인(Cos) 그래프 fig.savefig("sin&cos.png")


※ 선 그래프 ※


  이제 선 그래프를 그리는 방법에 대해서 알아보도록 하겠습니다. 가장 간단한 예제부터 알아봅시다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y = x ** 2 plt.plot(x, y, linestyle=":", marker="*") plt.show()


  라인 스타일로는 '-', ':', '-.', '--' 등이 사용될 수 있습니다. 또한 X축 및 Y축에서 특정 범위를 자를 수도 있습니다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y = x ** 2 plt.plot(x, y, linestyle="-.", marker="*") plt.xlim(-5, 5) plt.show()


  하나의 사진에 두 개의 라인 그래프를 그려 보겠습니다.


import matplotlib.pyplot as plt import numpy as np x = np.arange(-9, 10) y1 = x ** 2 y2 = -x plt.plot(x, y1, linestyle="-.", marker="*", color="red", label="y = x * x") plt.plot(x, y2, linestyle=":", marker="o", color="blue", label="y = -x") plt.xlabel("X") plt.ylabel("Y") plt.legend( shadow=True, borderpad=1 ) plt.show()




728x90
반응형

728x90
반응형

※ Data Frame의 마스킹 ※


  Pandas의 Data Frame 라이브러리는 Numpy처럼 마스킹 연산이 가능합니다.


import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(1, 10, (2, 2)), index=[0, 1], columns=["A", "B"])
print(df) # 데이터 프레임 출력하기
print(df["A"] <= 5) # 컬럼 A의 원소가 5보다 작거나 같은 데이터 추출
print(df.query("A <= 5 and B <= 8")) # 컬럼 A의 원소가 5보다 작고, 컬럼 B의 원소가 8보다 작은 데이터 추출


※ 함수로 데이터 변경하기 ※


  apply()라는 함수를 이용하면 특정한 함수를 공통적으로 적용할 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([[1, 2, 3, 4], [1, 2, 3, 4]], index=[0, 1], columns=["A", "B", "C", "D"])
print(df)
df = df.apply(lambda x: x + 1)
print(df)

def addOne(x):
    return x + 1

df = df.apply(addOne)
print(df)


  또한 replace() 함수도 원소의 값을 바꿀 때 매우 많이 사용됩니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 'Apple', 'Carrot', 'Banana'],
    ['Durian', 'Banana', 'Apple', 'Carrot']],
    index=[0, 1],
    columns=["A", "B", "C", "D"])
print(df)
df = df.replace({"Apple": "Airport"})
print(df)


※ 데이터 그룹화 ※


  Pandas는 데이터를 그룹화할 수 있도록 groupby() 함수를 제공하고 있습니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 'Fruit'],
    ['Banana', 3, 'Fruit'],
    ['Beef', 5, 'Meal'],
    ['Kimchi', 4, 'Meal']],
    columns=["Name", "Frequency", "Type"])
print(df)
print(df.groupby(['Type']).sum())


  더불어 aggregate() 함수를 이용하면 보다 자유자재로 그룹화를 다룰 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])
print(df)
print(df.groupby(["Type"]).aggregate([min, max, np.average]))


  그룹에 대한 필터링(Filtering)을 걸고자 한다면 다음과 같이 filter() 함수를 이용할 수 있습니다. 저는 빈도수(Frequency) 평균이 5 이상인 타입(Type)만 추출하도록 소스코드를 작성해보았습니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

def my_filter(data):
    return data["Frequency"].mean() >= 5

df = df.groupby("Type").filter(my_filter)
print(df)


  또한 가장 단순한 형태의 필터링은 다음과 같이 임의의 속성으로 데이터를 추출하는 것입니다.


import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

df = df.groupby("Type").get_group("Fruit")
print(df)


  더불어 apply() 함수를 이용해 임의의 함수를 적용할 수도 있습니다. 저는 각 데이터가 평균 값에 비해서 어느 정도 격차가 나오는지 그룹별로 확인해보는 소스코드를 작성했습니다.


import pandas as pd df = pd.DataFrame([ ['Apple', 7, 5, 'Fruit'], ['Banana', 3, 6, 'Fruit'], ['Beef', 5, 2, 'Meal'], ['Kimchi', 4, 8, 'Meal']], columns=["Name", "Frequency", "Importance", "Type"]) df["Gap"] = df.groupby("Type")["Frequency"].apply(lambda x: x - x.mean()) print(df)


※ 다중화 ※


  Pandas에서는 데이터를 다중화할 수도 있습니다. 인덱스를 여러 개로 구성하는 방법은 다음과 같습니다. 열 또한 마찬가지의 방법을 이용해서 다중 인덱스를 구성할 수 있습니다.


import numpy as np
import pandas as pd

df = pd.DataFrame(
    np.random.randint(1, 10, (4, 4)),
    index=[['1차', '1차', '2차', '2차'], ['공격', '수비', '공격', '수비']],
    columns=['1회', '2회', '3회', '4회']
)

print(df)
print(df[["1회", "2회"]].loc["2차"])


※ 피벗 테이블 ※


  피벗 테이블(Pivot Table)은 흔히 엑셀에서 표 데이터를 재구성할 때 사용하는 기능입니다. Pandas는 이러한 피벗 테이블 기능을 제공합니다. 저는 기존의 데이터에서 인덱스로 'Importance'를, 열로 'Type'을 두고 빈도수를 출력하는 프로그램을 작성하고자 합니다. 동일한 Importance 값이 있다면 가장 큰 빈도수가 출력되도록 합니다.


import numpy as np
import pandas as pd

df = pd.DataFrame([
    ['Apple', 7, 5, 'Fruit'],
    ['Banana', 3, 6, 'Fruit'],
    ['Coconut', 2, 6, 'Fruit'],
    ['Rice', 8, 2, 'Meal'],
    ['Beef', 5, 2, 'Meal'],
    ['Kimchi', 4, 8, 'Meal']],
    columns=["Name", "Frequency", "Importance", "Type"])

df = df.pivot_table(
    index="Importance", columns="Type", values="Frequency",
    aggfunc=np.max
)
print(df)



728x90
반응형

728x90
반응형

  파이썬(Python)에서 Pandas 라이브러리를 제대로 활용하기 위해서는 다양한 연산 방법과 함수에 대해서 알고 있어야 합니다.


※ 데이터 프레임의 NULL 여부 확인 ※


  NULL 여부를 확인할 때는 isnull() 혹은 notnull() 함수를 사용할 수 있습니다. 현실 세계의 다양한 데이터는 존재하지 않는 경우도 있기 때문에 NULL 값에 대한 체크가 필요합니다. 또한 fillna() 함수를 이용해서 NULL 값을 다른 값으로 치환할 수 있습니다.


import numpy as np
import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': np.nan,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

print(summary.notnull())
print(summary.isnull())
summary['frequency'] = summary['frequency'].fillna('데이터 없음')
print(summary)


※ Series 자료형의 연산 ※


  Series 자료형은 사칙연산을 수행할 수 있습니다. 이 때 NULL 데이터는 어떻게 처리할지의 여부도 결정할 수 있습니다.


import pandas as pd array1 = pd.Series([1, 2, 3], index=['A', 'B', 'C']) array2 = pd.Series([4, 5, 6], index=['B', 'C', 'D']) array1 = array1.add(array2, fill_value=0) print(array1)


※ Data Frame 자료형의 연산 ※


  Series 자료형을 여러 개 묶은 형태인 Data Frame도 당연히 사칙연산을 수행할 수 있습니다. 저는 2차원 배열 형태를 Data Frame으로 변환하여 연산을 수행해보았습니다. Data Frame 변수인 array1에서는 원래 (0, 2) 위치에 데이터가 존재하지 않았으므로 여전히 NaN으로 처리됩니다. 다만 array1에 더해지는 array2에서 존재하지 않는 데이터는 0으로 치환됩니다.


import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

print(array1)
print(array2)

array1 = array1.add(array2, fill_value=0)
print(array1)


※ Data Frame의 집계 함수 ※


import pandas as pd

array1 = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'])
array2 = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]], index=['B', 'C', 'D'])

array1 = array1.add(array2, fill_value=0)
print(array1)
print("컬럼 1의 합:", array1[1].sum())
print(array1.sum())


※ Data Frame의 정렬 함수 ※


  데이터 프레임의 특정한 컬럼으로 정렬을 수행할 수도 있습니다.


import numpy as np import pandas as pd word_dict = { 'Apple': '사과', 'Banana': '바나나', 'Carrot': '당근', 'Durian': '두리안' } frequency_dict = { 'Apple': 3, 'Banana': 5, 'Carrot': 1, 'Durian': 2 } importance_dict = { 'Apple': 3, 'Banana': 2, 'Carrot': 1, 'Durian': 1 } word = pd.Series(word_dict) frequency = pd.Series(frequency_dict) importance = pd.Series(importance_dict) summary = pd.DataFrame({ 'word': word, 'frequency': frequency, 'importance': importance }) summary = summary.sort_values('frequency', ascending=False) print(summary)



728x90
반응형

728x90
반응형

  판다스(Pandas)는 파이썬(Python) 라이브러리 중 하나로서 데이터를 효과적으로 처리하고 보여줄 수 있도록 도와줍니다. 또한 Numpy와 함께 사용되어 다양한 연계 기능을 제공합니다. 판다스의 기본 자료형 중 하나로는 시리즈(Series)가 있습니다. 이는 Numpy 배열과 흡사하지만 인덱스(Index)를 제공한다는 점에서 사전(Dictionary) 자료형에 가깝습니다. 이를 이용해 인덱스로 특정한 데이터에 바로 접근할 수 있습니다.


import pandas as pd array = pd.Series(['사과', '바나나', '당근'], index=['a', 'b', 'c']) print(array['a'])


  사전과 흡사하게 동작한다는 점에서 파이썬(Python)의 사전(Dictionary)를 판다스 객체로 만들 수 있습니다.


import pandas as pd

dict = {
    'a': '사과',
    'b': '바나나',
    'c': '당근'
}

array = pd.Series(dict)
print(array['a'])


※ 데이터 프레임(Data Frame) ※


  데이터 프레임은 Pandas에서 다수의 Series 데이터를 모아 처리하는 목적으로 사용할 수 있습니다. 일반적으로 표 형태로 특정한 데이터를 출력하고자 할 때 간단히 사용할 수 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

print(summary)


  또한 Pandas도 Numpy와 마찬가지로 연산이 가능합니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

score = summary['frequency'] * summary['importance']
summary['score'] = score

print(summary)


  이러한 판다스 객체는 인덱스를 기준으로 처리하고, 슬라이싱 하는 등의 작업을 수행할 수 있습니다. 슬라이싱을 할 때는 iloc 혹은 loc를 사용할 수 있습니다. iloc는 인덱스를 기준으로 슬라이싱을 처리하도록 도와줍니다.


import pandas as pd

word_dict = {
'Apple': '사과',
'Banana': '바나나',
'Carrot': '당근',
'Durian': '두리안'
}

frequency_dict = {
'Apple': 3,
'Banana': 5,
'Carrot': 7,
'Durian': 2
}

importance_dict = {
'Apple': 3,
'Banana': 2,
'Carrot': 1,
'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
'word': word,
'frequency': frequency,
'importance': importance
})

print(summary)
print(summary.loc['Banana':'Carrot', 'importance':])
print(summary.iloc[1:3, 2:])


  같은 문법을 활용하여 특정한 데이터를 수정하거나 삽입할 수도 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근',
    'Durian': '두리안'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7,
    'Durian': 2
}

importance_dict = {
    'Apple': 3,
    'Banana': 2,
    'Carrot': 1,
    'Durian': 1
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)
importance = pd.Series(importance_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency,
    'importance': importance
})

summary.loc['Apple', 'importance'] = 5 # 데이터의 변경
summary.loc['Elderberry'] = ['엘더베리', 5, 3] # 새 데이터 삽입
print(summary)


※ Pandas를 이용해 엑셀(Excel)로 내보내기/불러오기 ※


  판다스의 내장 함수를 이용하면 엑셀 파일 형태로 내보내거나 불러올 수도 있습니다.


import pandas as pd

word_dict = {
    'Apple': '사과',
    'Banana': '바나나',
    'Carrot': '당근'
}

frequency_dict = {
    'Apple': 3,
    'Banana': 5,
    'Carrot': 7
}

word = pd.Series(word_dict)
frequency = pd.Series(frequency_dict)

summary = pd.DataFrame({
    'word': word,
    'frequency': frequency
})

summary.to_csv("summary.csv", encoding="utf-8-sig")
saved = pd.read_csv("summary.csv", index_col=0)
print(saved)


728x90
반응형

728x90
반응형

  파이썬(Python)의 넘파이(Numpy) 라이브러리에서는 다양한 기본 연산을 지원합니다. 기본적인 사칙연산을 지원하는데, 이러한 연산들은 배열 안에 포함되어 있는 원소에 대한 연산입니다. 예를 들어 배열의 모든 원소의 값에 10을 더하는 등의 작업을 수행할 수 있습니다. 저는 1부터 9까지의 숫자를 랜덤하게 3개만큼 생성하여 각 원소에 10씩 더하도록 프로그래밍을 해보았습니다.


import numpy as np array = np.random.randint(1, 10, size=3) result_array = array + 10 print(result_array[0], result_array[1], result_array[2])


  당연히 곱셈 또한 가능합니다.


import numpy as np array = np.random.randint(1, 10, size=3) result_array = array * 10 print(result_array[0], result_array[1], result_array[2])


  또한 이러한 Numpy의 연산은 Numpy 배열의 형태와 관계 없이 사용할 수 있습니다.


import numpy as np

array = np.random.randint(1, 10, size=4).reshape(2, 2)

result_array = array * 10

print(result_array[0][0], result_array[1][0], result_array[1][1])


※ 서로 다른 형태의 Numpy 연산 ※


  서로 다른 형태를 가진 Numpy 배열 끼리도 연산할 수 있습니다. 이 때는 기본적으로 행우선으로 연산이 이루어집니다.


import numpy as np

array1 = np.arange(4).reshape(2, 2)
array2 = np.arange(2)
array3 = array1 + array2

print(array3[0][0], array3[0][1], array3[1][0], array3[1][1])

  

  서로 다른 형태(Shape이 다를 때)의 Numpy를 연산할 때에는 브로드캐스트(Broadcast)가 적용됩니다. 다시 말해 브로드캐스트란 서로 모양이 다른 배열을 연산할 수 있도록 배열의 형태를 동적으로 변환하는 기법입니다.


  예를 들어


1 2 3

4 5 6

7 8 9



1 2 3을 더하면,


2 4 6

5 7 9

8 10 12


가 됩니다.


array1 = np.arange(1, 10)
array1 = array1.reshape(3, 3)

array2 = np.arange(1, 4)

print(array1 + array2)


  # 브로드캐스트는 최소한 하나의 배열의 차원의 크기가 1일 때 가능합니다.

  # 브로드캐스트는 차원에 대해서 축의 길이가 같을 때 사용이 가능합니다.


  그러므로 1 X 4인 배열과 4 X 1인 배열끼리도 덧셈이 가능한 것입니다. 이 때 자동으로 브로드캐스트가 적용되어 1 X 4는 4 X 4로 확장 되고, 4 X 1 또한 4 X 4로 확장 되어 연산이 이루어진다고 볼 수 있습니다.


import numpy as np

array1 = np.arange(4).reshape(4, 1)
array2 = np.arange(4)
array3 = array1 + array2

print(array3[0][0], array3[0][1], array3[0][2], array3[0][3])
print(array3[1][0], array3[1][1], array3[1][2], array3[1][3])
print(array3[2][0], array3[2][1], array3[2][2], array3[2][3])
print(array3[3][0], array3[3][1], array3[3][2], array3[3][3])


  또한 Numpy는 마스킹 연산도 수행이 가능합니다. 이는 각 원소가 특정한 조건을 만족하는지에 대한 결과가 배열 형태로 반환이 이루어집니다.


import numpy as np

# Numpy 원소의 값을 조건에 따라 바꿀 때는 다음과 같이 합니다.
# 반복문을 이용할 때보다 매우 빠르게 동작합니다.
# 대체로 이미지 처리(Image Processing)에서 자주 활용됩니다.
array1 = np.arange(16).reshape(4, 4)
print(array1)

array2 = array1 < 10
print(array2)

array1[array2] = 100
print(array1)


※ Numpy의 연산 함수 ※


  Numpy는 다양한 기본 함수들을 제공합니다.


import numpy as np

array = np.arange(16).reshape(4, 4)

print("최대값:", np.max(array))
print("최소값:", np.min(array))
print("합계:", np.sum(array))
print("평균값:", np.mean(array))


  가로 축에 대한 집계도 가능합니다.


import numpy as np

array = np.arange(16).reshape(4, 4)

print("합계:", np.sum(array, axis=0))



728x90
반응형