<jupyter_start><jupyter_text>Numpy Basic  Numpy 개요넘파이는 고성능 수치계산을 위한 라이브러리이다.  ndarray는 다차원 배열이다. **Numpy 로 하는 일*** List 자료로 Numpy array 로 만들기* 행렬 형태 확인하기* 행렬 형태 바꾸기* 행렬 데이터 만들기* 행렬의 일부 구간 추출하기* 행렬끼리 더하기, 곱하기, 행렬 원소간의 연산* 행렬끼리 합치기* 그외 연산<jupyter_code>import numpy as np  # Make numpy available using np<jupyter_output><empty_output><jupyter_text>ndarray의 생성* np.array()로 다차원 배열을 생성할 수 있다.* np.append() - 생성된 배열에 원소(element)를 추가한다.* 다차원 배열의 원소는 index를 통해 접근할 수 있다.<jupyter_code># Create a numpy array, and append an element
a = np.array(["Hello", "World"])
a = np.append(a, "!")
print("Current array: {}".format(a))
print("Printing each element")
for i in a:
    print(i)

print("\nPrinting each element and their index")
for i,e in enumerate(a):
    print("Index: {}, was: {}".format(i, e))<jupyter_output>Current array: ['Hello' 'World' '!']
Printing each element
Hello
World
!

Printing each element and their index
Index: 0, was: Hello
Index: 1, was: World
Index: 2, was: !<jupyter_text>수학 함수의 사용* universal function - 다차원 배열에 일반적인 수학 함수를 적용할 수 있다.<jupyter_code>print("\nShowing some basic math on arrays")
b = np.array([0,1,4,3,2])
print("Max: {}".format(np.max(b)))
print("Average: {}".format(np.average(b)))
print("Max index: {}".format(np.argmax(b)))
print("\nYou can print the type of anything")
print("Type of b: {}, type of b[0]: {}".format(type(b), type(b[0])))<jupyter_output>You can print the type of anything
Type of b: <class 'numpy.ndarray'>, type of b[0]: <class 'numpy.int32'><jupyter_text>data type array의 dtype을 본다.<jupyter_code>arr = np.array([[1., 2, 3], [1, 2, 3]])
arr.dtype<jupyter_output><empty_output><jupyter_text>.astype()으로 datatype을 변환 가능<jupyter_code>arr = arr.astype(np.int32)
arr
arr = np.array([[1., 2, 3], [1, 2, 3]], dtype=np.uint8)
arr.dtype<jupyter_output><empty_output><jupyter_text>ndarray의 차원 확인len(arr.shape) 를 통해서 차원의 갯수를 확인 할 수 있지만,  아래와 같이 ndim을 통해 차원 수를 return 가능<jupyter_code>len(arr.shape)
arr.shape<jupyter_output><empty_output><jupyter_text>size 확인<jupyter_code>arr.size<jupyter_output><empty_output><jupyter_text>dtype 확인<jupyter_code>arr.dtype<jupyter_output><empty_output><jupyter_text>Reshapendarray의 형태를 변경한다.<jupyter_code># 행렬의 형태 변경하기
c = [[1,2,3],[4,5,6]]

C = np.array(c)

print('Numpy array C: \n', C)
print('Shape of C :', C.shape)

C = C.reshape(3,2)
print('Numpy array C (reshaped to (3,2)): \n', C)   
C_colvector = C.reshape(-1,1)   # 행의 크기는 미정이지만 열의 크기는 1로 고정하겠다는 표현입니다.
C_colvector
print(arr)
print(arr.shape)<jupyter_output>[[1 2 3]
 [1 2 3]]
(2, 3)<jupyter_text>Reshape<jupyter_code>arr = arr.reshape([1, 6])
arr.shape
arr = np.array([[1, 2, 3], [1, 2, 3]])
arr.reshape([6]).shape<jupyter_output><empty_output><jupyter_text>Reshape, -1 활용<jupyter_code>arr = arr.reshape(-1)
arr.shape
arr = arr.reshape(-1, 3)
arr.shape<jupyter_output><empty_output><jupyter_text>random array 생성* np.random.randint : 균일 분포의 정수 난수 생성* np.random.rand : 0부터 1사이의 균일 분포에서 난수 배열 생성* np.random.randn : 가우시안 표준 정규 분포에서 난수 배열 생성<jupyter_code>arr = np.random.randn(8, 8)
arr.shape
arr = arr.reshape([32, 2])
arr.shape<jupyter_output><empty_output><jupyter_text>3차원으로 늘리기<jupyter_code>arr = arr.reshape(-1, 4, 4)
arr.shape
arr<jupyter_output><empty_output><jupyter_text>Ravelarr의 차원을 1로 변경한다.<jupyter_code>arr.shape
arr = arr.ravel()
arr.shape<jupyter_output><empty_output><jupyter_text>ravel은 arr.reshape(-1) 와 같다<jupyter_code>arr.ravel() == arr.reshape(-1)<jupyter_output><empty_output><jupyter_text>np.expand_dims() 배열의 값은 유지하되 차원 수를 늘리고 싶을 때가 있다. 이럴 때 손쉽게 차원을 변경할때 활용되는 것이 expand_dims 함수이다.<jupyter_code>arr.shape
arr = np.expand_dims(arr, -1)
arr.shape
arr = arr.ravel()
arr.shape
arr = np.expand_dims(np.expand_dims(arr, -1), 0)
arr.shape<jupyter_output><empty_output><jupyter_text>특정값으로 초기화된 배열의 생성 * np.zeros() : 0으로 초기화된 배열의 생성* np.ones() : 1로 초기화된 배열의 생성* np.arange() : 정수 일렬번호로 초기화된 배열의 생성 0으로 채워진 numpy array를 만들 수 있음<jupyter_code>zeros = np.zeros([3, 3])
zeros
zeros = np.zeros(1)
zeros
ones = np.ones([10, 5])
ones
ones * 5
arr = np.arange(5)
arr
arr = np.arange(4, 9)
arr
arr = np.arange(10, 20)
arr
arr = np.arange(9).reshape(3, 3)
arr<jupyter_output><empty_output><jupyter_text>배열의 조회 - Indexing<jupyter_code>nums = [1, 2, 3, 4, 5]
nums[2:]
nums = [1, 2, 3, 4, [1, 2, 3]]
nums
nums[4]
arr[1][2]
arr[1, 2]<jupyter_output><empty_output><jupyter_text>배열 Slicing<jupyter_code>arr
arr[1:]
arr[1:, 1:]
arr<jupyter_output><empty_output><jupyter_text>Boolean Indexing<jupyter_code>data = np.random.randn(3, 3)
data
data <= 0
data[data <= 0] = 1
data<jupyter_output><empty_output><jupyter_text>Broadcasting브로드캐스팅은 모양이 다른 배열끼리의 연산도 가능하게 해주며 모양이 부족한 부분은 확장하여 연산을 수행할 수 있도록 한다.<jupyter_code>import numpy as np
arr = np.arange(9).reshape(3, 3)
arr
arr + 3
arr * 3
arr
arr + np.array([1, 2, 3])<jupyter_output><empty_output><jupyter_text>배열의 연산,  Math Function<jupyter_code>arr + 10
arr * 5
arr + arr
np.add(arr, 1)
arr + 1
np.multiply(arr, 3)
np.random.seed(0) 
arr = np.random.randint(2, size=27).reshape(3, 3, 3)  # 랜덤 정수로 초기화된 배열의 생성
arr_2 = np.random.randint(2, size=9).reshape(3, 3) # 랜덤 정수로 초기화된 배열의 생성
arr.shape, arr_2.shape
arr + arr_2 # 브로드캐스팅을 통한 연산
arr * arr_2
np.sum(arr)
np.sum(arr + arr_2)
arr + arr_2
(arr + arr_2).shape
np.max(arr + arr_2)
np.min(arr + arr_2)
np.max(arr + arr_2, axis=-1) # axis = -1 은 이 경우 axis=2와 동일하다.
np.sum(arr + arr_2, axis=-1)
np.mean(arr)<jupyter_output><empty_output><jupyter_text>* np.argmax() : 배열에서 최대값의 index를 리턴* np.argmin() : 배열에서 최소값의 index를 리턴<jupyter_code>arr = np.array([1, 6, 3, 7, 3, 2, 9, 0, 2])
arr
np.argmax(arr)
np.argmin(arr)<jupyter_output><empty_output><jupyter_text>np.unique() - 이 함수는 입력된 배열에서 중복되지 않는 고유한 요소들의 배열을 리턴한다.* return_counts = True - 중복 되지 않는 요소들의 개수를 리턴한다.<jupyter_code>arr = np.array([3, 5, 6, 6, 3, 3, 1])
np.unique(arr) 
np.unique(arr, return_counts=True)<jupyter_output><empty_output><jupyter_text>행렬의 기본연산<jupyter_code>E = np.arange(1,7).reshape(2,3);
print(E)
print(E + 1)
E + E
F = np.array([1,2]).reshape(-1,1) 
E * F   #  E 의 첫 행에는 1을 곱하고 두 번쨰 행에는 2를 곱한 결과을 얻습니다.
H = np.array([1,0,1]).reshape(-1,1)
print(E)
print(H)
E.dot(H)<jupyter_output><empty_output><jupyter_text>배열의 연결* np.hstack() : 배열을 수평방향으로 연결한다.* np.vstack() : 배열을 수직방향으로 연결한다.<jupyter_code>np.hstack((E,E))
np.vstack((E,E))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16410502721741915, 'fraction_numerical': 0.03154018571886007, 'mean_word_length': 5.527690700104493, 'pattern_counts': {'":': 0, '<': 106, '<?xml version=': 0, '>': 104, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '26', 'dir': 'jupyter-structured-clean-dedup', 'id': '474134', 'license': 'MIT', 'n_tokens_mistral': 3449, 'n_tokens_neox': 3816, 'n_words': 660, 'path': '02NumPy/01numpy_기초.ipynb', 'repo_name': 'aonekoda/YGL_1', 'size': '6246'}