8월28일

Win Cha·2026년 8월 31일

numpy 예제와 숙제

연도별 남아, 여아 출생 수

li = [[1880, 90993, 110491],
[1881, 91954, 100745],
[1882, 107850, 113688],
[1883, 112321, 104629],
[1884, 129022, 114445],
[1885, 133055, 107800],
[1886, 144535, 110784],
[1887, 145982, 101414],
[1888, 178627, 120853],
[1889, 178366, 110584],
[1890, 190377, 111025],
[1891, 185482, 101196],
[1892, 212346, 122037],
[1893, 212906, 112317],
[1894, 222922, 115772],
[1895, 233630, 117398],
[1896, 237920, 119570],
[1897, 234202, 112758],
[1898, 258770, 122693],
[1899, 233023, 106212],
[1900, 299828, 150499],
[1901, 239348, 106471],
[1902, 264077, 122659],
[1903, 261973, 119234],
[1904, 275371, 128125],
[1905, 291629, 132319],
[1906, 295303, 133159],
[1907, 318566, 146833],
[1908, 334313, 154344],
[1909, 347228, 163999],
[1910, 396501, 194218],
[1911, 418299, 225968],
[1912, 558103, 429945],
[1913, 624518, 512557],
[1914, 761548, 654762],
[1915, 983874, 848603],
[1916, 1044323, 890099],
[1917, 1081280, 925511],
[1918, 1157647, 1013537],
[1919, 1130145, 980149],
[1920, 1198283, 1064463],
[1921, 1232999, 1101457],
[1922, 1200919, 1088287],
[1923, 1206330, 1096168],
[1924, 1248876, 1132751],
[1925, 1217352, 1115958],
[1926, 1185304, 1110505],
[1927, 1192330, 1126717],
[1928, 1153117, 1107518],
[1929, 1116422, 1075313],
[1930, 1125761, 1097176],
[1931, 1064497, 1039127],
[1932, 1066994, 1043808],
[1933, 1007710, 991127],
[1934, 1044039, 1032291],
[1935, 1048428, 1040930],
[1936, 1040202, 1036974],
[1937, 1063872, 1066309],
[1938, 1103277, 1108841],
[1939, 1096518, 1106544],
[1940, 1143325, 1158900],
[1941, 1207919, 1227941],
[1942, 1350545, 1380774],
[1943, 1395082, 1426846],
[1944, 1327104, 1362555],
[1945, 1307028, 1345610],
[1946, 1571184, 1623650],
[1947, 1772644, 1829223],
[1948, 1697814, 1754469],
[1949, 1710825, 1773725],
[1950, 1713180, 1790673],
[1951, 1800042, 1881080],
[1952, 1854698, 1944277],
[1953, 1880326, 1969777],
[1954, 1941682, 2037374],
[1955, 1954664, 2057918],
[1956, 2007512, 2113694],
[1957, 2044160, 2155866],
[1958, 2010884, 2120712],
[1959, 2023044, 2133509],
[1960, 2022093, 2132717],
[1961, 2017316, 2122502],
[1962, 1966548, 2068945],
[1963, 1927217, 2031755],
[1964, 1894594, 1993270],
[1965, 1765001, 1861378],
[1966, 1691868, 1783964],
[1967, 1650764, 1744527],
[1968, 1640103, 1738928],
[1969, 1686947, 1789732],
[1970, 1748147, 1859594],
[1971, 1663475, 1769201],
[1972, 1521185, 1622666],
[1973, 1458139, 1559338],
[1974, 1467413, 1573105],
[1975, 1457699, 1562207],
[1976, 1465096, 1569904],
[1977, 1532997, 1643684],
[1978, 1531658, 1642250],
[1979, 1605051, 1721947],
[1980, 1659933, 1783876],
[1981, 1667465, 1790907],
[1982, 1692678, 1813970],
[1983, 1670061, 1791732],
[1984, 1682973, 1803830],
[1985, 1720036, 1847032],
[1986, 1714664, 1840164],
[1987, 1737891, 1865662],
[1988, 1779839, 1912602],
[1989, 1843105, 1999999],
[1990, 1897709, 2052543],
[1991, 1874434, 2019463],
[1992, 1843304, 1996388],
[1993, 1808379, 1960397],
[1994, 1785074, 1931157],
[1995, 1757927, 1902832],
[1996, 1752249, 1893378],
[1997, 1739806, 1884122],
[1998, 1765915, 1910250],
[1999, 1772632, 1918809],
[2000, 1814601, 1962406],
[2001, 1799049, 1941251],
[2002, 1795206, 1939815],
[2003, 1825359, 1973434],
[2004, 1834145, 1982794],
[2005, 1845379, 1994841],
[2006, 1898463, 2052377],
[2007, 1919408, 2072139],
[2008, 1887234, 2036289],
[2009, 1832925, 1979303],
[2010, 1772738, 1913851],
[2011, 1753500, 1893230]]

import numpy as np

1. 남아, 여아 출생 평균을 구하시오

birth = np.array(li)

print(birth.shape)

# print(birth)

rs = birth.mean(axis=0)

print(rs[1:3])

print("남아 평균 : {}".format(int(rs[1])))

print("여아 평균 : {}".format(rs[2]))

2. 남아 출생이 가장 많은 연도와 남아의 수를 구하시오

boys = birth[:, 1]

# print(boys)

max_v = boys.max()

print(max_v) # 2044160

print("남아 최댓값 : {}".format(max_v))

idx = boys == max_v

print(idx)

rs = birth[idx]

print(rs)

print(rs[::, :2])

3. 2000년 이후 데이터

print(birth)

print(birth[:,0])

print(birth[:,0] >= 2000)

print(birth[birth[:,0] >= 2000])

4. 1800년대, 1900년대, 2000년대 각 남아 여아 수의 평균을 구하시오.

cen1900_a = birth[birth[:,0] >= 1900]
cen1900_b = cen1900_a[cen1900_a[:,0] < 2000]

print(cen1900_b)

cen2000 = birth[birth[:,0] >= 2000]

print(cen2000)

cen1800 = birth[birth[:,0] < 1900]

print(cen1800)

avg_1800 = cen1800.mean(axis = 0)[1:3]
avg_1900 = cen1900_b.mean(axis = 0)[1:3]
avg_2000 = cen2000.mean(axis = 0)[1:3]

print("1800년대 남아 평균 : {}".format(int(avg_1800[0])))
print("1800년대 여아 평균 : {}".format(avg_1800[1]))
print("1900년대 남아 평균 : {}".format(avg_1900[0]))
print("1900년대 여아 평균 : {}".format(avg_1900[1]))
print("2000년대 남아 평균 : {}".format(avg_2000[0]))
print("2000년대 여아 평균 : {}".format(avg_2000[1]))

NumPy에서 데이터를 추출(인덱싱/슬라이싱)하고 가공(형태 변경/연산)하는 핵심 방법 이해.
설명을 위해 아래의 3행 4열 2차원 배열을 기준으로 예시.

import numpy as nparr = np.array([[10, 20, 30, 40],
[90, 100, 110, 120]])


1. 데이터 추출 (Indexing & Slicing)## 특정 위치 추출

쉼표( , )를 기준으로 [행, 열] 위치를 지정합니다. (0부터 시작)

  • 특정 원소 한 개: arr[1, 2] → 70 (2행 3번째 원소)
  • 특정 행 전체: arr[0, :] 또는 arr[0] → [10, 20, 30, 40] (1행 전체)
  • 특정 열 전체: arr[:, 1] → [20, 60, 100] (2열 전체)

범위 슬라이싱 [시작:끝]

원하는 구간을 잘라내며, 끝 인덱스는 포함되지 않습니다.

  • 일부 행과 열 잘라내기: arr[0:2, 1:3]
    → [[20, 30], [60, 70]] (1~2행의 2~3열만 추출)

조건 추출 (Boolean Indexing) ⭐ 중요

조건식을 넣으면 조건을 만족하는(True) 데이터만 1차원 배열로 뽑아줍니다.

  • 70 이상인 값만 추출: arr[arr >= 70]
    → [70, 80, 90, 100, 110, 120]

2. 데이터 가공 (Transformation & Math)## 📌 모양 바꾸기 (.reshape())

데이터를 유지한 채 배열의 차원과 구조를 바꿉니다.

  • 1차원으로 펼치기: arr.reshape(-1) 또는 arr.flatten()
  • 4행 3열로 바꾸기: arr.reshape(4, 3)
    (※ 바꾸기 전후의 전체 원소 개수가 같아야 합니다.)

행과 열 바꾸기 (전치, Transpose)

  • 축 바꾸기: arr.T (3행 4열 → 4행 3열로 반전)

조건에 따라 값 바꾸기 (np.where)

  • np.where(조건, True일 때 값, False일 때 값)
  • 예시: np.where(arr >= 70, 1, 0)
    • 70 이상인 값은 모두 1로, 나머지는 0으로 일괄 변경합니다.

데이터 병합 (합치기)

  • 위아래로 합치기: np.vstack([arr1, arr2])
  • 좌우로 합치기: np.hstack([arr1, arr2])

3. 축(Axis) 기준 연산 데이터 가공

NumPy는 axis 파라미터를 통해 행별, 열별 연산을 쉽게 처리합니다.

  • 전체 합계: np.sum(arr) → 780
  • 열별 합계 (위에서 아래로): np.sum(arr, axis=0) → [150, 180, 210, 240]
  • 행별 평균 (좌에서 우로): np.mean(arr, axis=1) → [25., 65., 105.]

지금 해결하려는 데이터 분석 문제나 구현하고 싶은 구체적인 조건이 있으신가요?

  • 특정 조건을 만족하는 행 전체를 삭제하고 싶을 때
  • 두 개의 서로 다른 배열을 하나로 병합하고 싶을 때
  • 배열에서 가장 큰 값의 위치(인덱스)를 찾고 싶을 때

0개의 댓글