"
+print a.shape # 출력 "(3,)"
+print a[0], a[1], a[2] # 출력 "1 2 3"
+a[0] = 5 # 요소를 변경
+print a # 출력 "[5, 2, 3]"
-b = np.array([[1,2,3],[4,5,6]]) # Create a rank 2 array
-print b.shape # Prints "(2, 3)"
-print b[0, 0], b[0, 1], b[1, 0] # Prints "1 2 4"
+b = np.array([[1,2,3],[4,5,6]]) # rank가 2인 배열 생성
+print b.shape # 출력 "(2, 3)"
+print b[0, 0], b[0, 1], b[1, 0] # 출력 "1 2 4"
~~~
-Numpy also provides many functions to create arrays:
+리스트의 중첩이 아니더라도 Numpy는 배열을 만들기 위한 다양한 함수를 제공합니다.
~~~python
import numpy as np
-a = np.zeros((2,2)) # Create an array of all zeros
-print a # Prints "[[ 0. 0.]
- # [ 0. 0.]]"
+a = np.zeros((2,2)) # 모든 값이 0인 배열 생성
+print a # 출력 "[[ 0. 0.]
+ # [ 0. 0.]]"
-b = np.ones((1,2)) # Create an array of all ones
-print b # Prints "[[ 1. 1.]]"
+b = np.ones((1,2)) # 모든 값이 1인 배열 생성
+print b # 출력 "[[ 1. 1.]]"
-c = np.full((2,2), 7) # Create a constant array
-print c # Prints "[[ 7. 7.]
- # [ 7. 7.]]"
+c = np.full((2,2), 7) # 모든 값이 특정 상수인 배열 생성
+print c # 출력 "[[ 7. 7.]
+ # [ 7. 7.]]"
-d = np.eye(2) # Create a 2x2 identity matrix
-print d # Prints "[[ 1. 0.]
- # [ 0. 1.]]"
+d = np.eye(2) # 2x2 단위 행렬 생성
+print d # 출력 "[[ 1. 0.]
+ # [ 0. 1.]]"
-e = np.random.random((2,2)) # Create an array filled with random values
-print e # Might print "[[ 0.91940167 0.08143941]
+e = np.random.random((2,2)) # 임의의 값으로 채워진 배열 생성
+print e # 임의의 값 출력 "[[ 0.91940167 0.08143941]
# [ 0.68744134 0.87236687]]"
~~~
-You can read about other methods of array creation
-[in the documentation](http://docs.scipy.org/doc/numpy/user/basics.creation.html#arrays-creation).
+배열 생성에 관한 다른 방법들은 [문서](http://docs.scipy.org/doc/numpy/user/basics.creation.html#arrays-creation)를 참조하세요.
-### Array indexing
-Numpy offers several ways to index into arrays.
-**Slicing:**
-Similar to Python lists, numpy arrays can be sliced.
-Since arrays may be multidimensional, you must specify a slice for each dimension
-of the array:
+### 배열 인덱싱
+Numpy는 배열을 인덱싱하는 몇가지 방법을 제공합니다.
+
+**슬라이싱:**
+파이썬 리스트와 유사하게, Numpy 배열도 슬라이싱이 가능합니다. Numpy 배열은 다차원인 경우가 많기에, 각 차원별로 어떻게 슬라이스할건지 명확히 해야합니다:
~~~python
import numpy as np
@@ -498,165 +486,161 @@ import numpy as np
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
-# Use slicing to pull out the subarray consisting of the first 2 rows
-# and columns 1 and 2; b is the following array of shape (2, 2):
+# 슬라이싱을 이용하여 첫 두행과 1열,2열로 이루어진 부분배열을 만들어 봅시다;
+# b는 shape가 (2,2)인 배열이 됩니다:
# [[2 3]
# [6 7]]
b = a[:2, 1:3]
-# A slice of an array is a view into the same data, so modifying it
-# will modify the original array.
-print a[0, 1] # Prints "2"
-b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
-print a[0, 1] # Prints "77"
+# 슬라이싱된 배열은 원본 배열과 같은 데이터를 참조합니다, 즉 슬라이싱된 배열을 수정하면
+# 원본 배열 역시 수정됩니다.
+print a[0, 1] # 출력 "2"
+b[0, 0] = 77 # b[0, 0]은 a[0, 1]과 같은 데이터입니다
+print a[0, 1] # 출력 "77"
~~~
-You can also mix integer indexing with slice indexing.
-However, doing so will yield an array of lower rank than the original array.
-Note that this is quite different from the way that MATLAB handles array
-slicing:
+정수를 이용한 인덱싱과 슬라이싱을 혼합하여 사용할 수 있습니다.
+하지만 이렇게 할 경우, 기존의 배열보다 낮은 rank의 배열이 얻어집니다.
+이는 MATLAB이 배열을 다루는 방식과 차이가 있습니다.
+
+슬라이싱:
~~~python
import numpy as np
-# Create the following rank 2 array with shape (3, 4)
+# 아래와 같은 요소를 가지는 rank가 2이고 shape가 (3, 4)인 배열 생성
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
-# Two ways of accessing the data in the middle row of the array.
-# Mixing integer indexing with slices yields an array of lower rank,
-# while using only slices yields an array of the same rank as the
-# original array:
-row_r1 = a[1, :] # Rank 1 view of the second row of a
-row_r2 = a[1:2, :] # Rank 2 view of the second row of a
-print row_r1, row_r1.shape # Prints "[5 6 7 8] (4,)"
-print row_r2, row_r2.shape # Prints "[[5 6 7 8]] (1, 4)"
+# 배열의 중간 행에 접근하는 두가지 방법이 있습니다.
+# 정수 인덱싱과 슬라이싱을 혼합해서 사용하면 낮은 rank의 배열이 생성되지만,
+# 슬라이싱만 사용하면 원본 배열과 동일한 rank의 배열이 생성됩니다.
+row_r1 = a[1, :] # 배열a의 두번째 행을 rank가 1인 배열로
+row_r2 = a[1:2, :] # 배열a의 두번째 행을 rank가 2인 배열로
+print row_r1, row_r1.shape # 출력 "[5 6 7 8] (4,)"
+print row_r2, row_r2.shape # 출력 "[[5 6 7 8]] (1, 4)"
-# We can make the same distinction when accessing columns of an array:
+# 행이 아닌 열의 경우에도 마찬가지입니다:
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
-print col_r1, col_r1.shape # Prints "[ 2 6 10] (3,)"
-print col_r2, col_r2.shape # Prints "[[ 2]
- # [ 6]
- # [10]] (3, 1)"
+print col_r1, col_r1.shape # 출력 "[ 2 6 10] (3,)"
+print col_r2, col_r2.shape # 출력 "[[ 2]
+ # [ 6]
+ # [10]] (3, 1)"
~~~
-**Integer array indexing:**
-When you index into numpy arrays using slicing, the resulting array view
-will always be a subarray of the original array. In contrast, integer array
-indexing allows you to construct arbitrary arrays using the data from another
-array. Here is an example:
+**정수 배열 인덱싱:**
+Numpy 배열을 슬라이싱하면, 결과로 얻어지는 배열은 언제나 원본 배열의 부분 배열입니다.
+그러나 정수 배열 인덱싱을 한다면, 원본과 다른 배열을 만들수 있습니다.
+여기에 예시가 있습니다:
~~~python
import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])
-# An example of integer array indexing.
-# The returned array will have shape (3,) and
-print a[[0, 1, 2], [0, 1, 0]] # Prints "[1 4 5]"
+# 정수 배열 인덱싱의 예.
+# 반환되는 배열의 shape는 (3,)
+print a[[0, 1, 2], [0, 1, 0]] # 출력 "[1 4 5]"
-# The above example of integer array indexing is equivalent to this:
-print np.array([a[0, 0], a[1, 1], a[2, 0]]) # Prints "[1 4 5]"
+# 위에서 본 정수 배열 인덱싱 예제는 다음과 동일합니다:
+print np.array([a[0, 0], a[1, 1], a[2, 0]]) # 출력 "[1 4 5]"
-# When using integer array indexing, you can reuse the same
-# element from the source array:
-print a[[0, 0], [1, 1]] # Prints "[2 2]"
+# 정수 배열 인덱싱을 사용할 때,
+# 원본 배열의 같은 요소를 재사용 할 수 있습니다:
+print a[[0, 0], [1, 1]] # 출력 "[2 2]"
-# Equivalent to the previous integer array indexing example
-print np.array([a[0, 1], a[0, 1]]) # Prints "[2 2]"
+# 위 예제는 다음과 동일합니다
+print np.array([a[0, 1], a[0, 1]]) # 출력 "[2 2]"
~~~
-One useful trick with integer array indexing is selecting or mutating one
-element from each row of a matrix:
+정수 배열 인덱싱을 유용하게 사용하는 방법 중 하나는 행렬의 각 행에서 하나의 요소를 선택하거나 바꾸는 것입니다:
~~~python
import numpy as np
-# Create a new array from which we will select elements
+# 요소를 선택할 새로운 배열 생성
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
-print a # prints "array([[ 1, 2, 3],
- # [ 4, 5, 6],
- # [ 7, 8, 9],
- # [10, 11, 12]])"
+print a # 출력 "array([[ 1, 2, 3],
+ # [ 4, 5, 6],
+ # [ 7, 8, 9],
+ # [10, 11, 12]])"
-# Create an array of indices
+# 인덱스를 저장할 배열 생성
b = np.array([0, 2, 0, 1])
-# Select one element from each row of a using the indices in b
-print a[np.arange(4), b] # Prints "[ 1 6 7 11]"
-# Mutate one element from each row of a using the indices in b
+# b에 저장된 인덱스를 이용해 각 행에서 하나의 요소를 선택합니다
+print a[np.arange(4), b] # 출력 "[ 1 6 7 11]"
+
+# b에 저장된 인덱스를 이용해 각 행에서 하나의 요소를 변경합니다
a[np.arange(4), b] += 10
-print a # prints "array([[11, 2, 3],
- # [ 4, 5, 16],
- # [17, 8, 9],
- # [10, 21, 12]])
+print a # 출력 "array([[11, 2, 3],
+ # [ 4, 5, 16],
+ # [17, 8, 9],
+ # [10, 21, 12]])
~~~
-**Boolean array indexing:**
-Boolean array indexing lets you pick out arbitrary elements of an array.
-Frequently this type of indexing is used to select the elements of an array
-that satisfy some condition. Here is an example:
+**불리언 배열 인덱싱:**
+불리언 배열 인덱싱을 통해 배열속 요소를 취사 선택할 수 있습니다.
+불리언 배열 인덱싱은 특정 조건을 만족시키는 요소만 선택하고자 할 때 자주 사용됩니다.
+다음은 그 예시입니다:
~~~python
import numpy as np
a = np.array([[1,2], [3, 4], [5, 6]])
-bool_idx = (a > 2) # Find the elements of a that are bigger than 2;
- # this returns a numpy array of Booleans of the same
- # shape as a, where each slot of bool_idx tells
- # whether that element of a is > 2.
+bool_idx = (a > 2) # 2보다 큰 a의 요소를 찾습니다;
+ # 이 코드는 a와 shape가 같고 불리언 자료형을 요소로 하는 numpy 배열을 반환합니다,
+ # bool_idx의 각 요소는 동일한 위치에 있는 a의
+ # 요소가 2보다 큰지를 말해줍니다.
-print bool_idx # Prints "[[False False]
- # [ True True]
- # [ True True]]"
+print bool_idx # 출력 "[[False False]
+ # [ True True]
+ # [ True True]]"
-# We use boolean array indexing to construct a rank 1 array
-# consisting of the elements of a corresponding to the True values
-# of bool_idx
-print a[bool_idx] # Prints "[3 4 5 6]"
+# 불리언 배열 인덱싱을 통해 bool_idx에서
+# 참 값을 가지는 요소로 구성되는
+# rank 1인 배열을 구성할 수 있습니다.
+print a[bool_idx] # 출력 "[3 4 5 6]"
-# We can do all of the above in a single concise statement:
-print a[a > 2] # Prints "[3 4 5 6]"
+# 위에서 한 모든것을 한 문장으로 할 수 있습니다:
+print a[a > 2] # 출력 "[3 4 5 6]"
~~~
-For brevity we have left out a lot of details about numpy array indexing;
-if you want to know more you should
-[read the documentation](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html).
+튜토리얼을 간결히 하고자 numpy 배열 인덱싱에 관한 많은 내용을 생략했습니다.
+조금 더 알고싶다면 [문서](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html)를 참조하세요.
-### Datatypes
-Every numpy array is a grid of elements of the same type.
-Numpy provides a large set of numeric datatypes that you can use to construct arrays.
-Numpy tries to guess a datatype when you create an array, but functions that construct
-arrays usually also include an optional argument to explicitly specify the datatype.
-Here is an example:
+
+### 자료형
+Numpy 배열은 동일한 자료형을 가지는 값들이 격자판 형태로 있는 것입니다.
+Numpy에선 배열을 구성하는데 사용할 수 있는 다양한 숫자 자료형을 제공합니다.
+Numpy는 배열이 생성될 때 자료형을 스스로 추측합니다, 그러나 배열을 생성할 때 명시적으로 특정 자료형을 지정할수도 있습니다. 예시:
~~~python
import numpy as np
-x = np.array([1, 2]) # Let numpy choose the datatype
-print x.dtype # Prints "int64"
+x = np.array([1, 2]) # Numpy가 자료형을 추측해서 선택
+print x.dtype # 출력 "int64"
-x = np.array([1.0, 2.0]) # Let numpy choose the datatype
-print x.dtype # Prints "float64"
+x = np.array([1.0, 2.0]) # Numpy가 자료형을 추측해서 선택
+print x.dtype # 출력 "float64"
-x = np.array([1, 2], dtype=np.int64) # Force a particular datatype
-print x.dtype # Prints "int64"
+x = np.array([1, 2], dtype=np.int64) # 특정 자료형을 명시적으로 지정
+print x.dtype # 출력 "int64"
~~~
-You can read all about numpy datatypes
-[in the documentation](http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html).
+Numpy 자료형에 관한 자세한 사항은 [문서](http://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html)를 참조하세요.
-### Array math
-Basic mathematical functions operate elementwise on arrays, and are available
-both as operator overloads and as functions in the numpy module:
+
+### 배열 연산
+기본적인 수학함수는 배열의 각 요소별로 동작하며 연산자를 통해 동작하거나 numpy 함수모듈을 통해 동작합니다:
~~~python
import numpy as np
@@ -664,41 +648,37 @@ import numpy as np
x = np.array([[1,2],[3,4]], dtype=np.float64)
y = np.array([[5,6],[7,8]], dtype=np.float64)
-# Elementwise sum; both produce the array
+# 요소별 합; 둘 다 다음의 배열을 만듭니다
# [[ 6.0 8.0]
# [10.0 12.0]]
print x + y
print np.add(x, y)
-# Elementwise difference; both produce the array
+# 요소별 차; 둘 다 다음의 배열을 만듭니다
# [[-4.0 -4.0]
# [-4.0 -4.0]]
print x - y
print np.subtract(x, y)
-# Elementwise product; both produce the array
+# 요소별 곱; 둘 다 다음의 배열을 만듭니다
# [[ 5.0 12.0]
# [21.0 32.0]]
print x * y
print np.multiply(x, y)
-# Elementwise division; both produce the array
+# 요소별 나눗셈; 둘 다 다음의 배열을 만듭니다
# [[ 0.2 0.33333333]
# [ 0.42857143 0.5 ]]
print x / y
print np.divide(x, y)
-# Elementwise square root; produces the array
+# 요소별 제곱근; 다음의 배열을 만듭니다
# [[ 1. 1.41421356]
# [ 1.73205081 2. ]]
print np.sqrt(x)
~~~
-Note that unlike MATLAB, `*` is elementwise multiplication, not matrix
-multiplication. We instead use the `dot` function to compute inner
-products of vectors, to multiply a vector by a matrix, and to
-multiply matrices. `dot` is available both as a function in the numpy
-module and as an instance method of array objects:
+MATLAB과 달리, '*'은 행렬곱이 아니라 요소별 곱입니다. Numpy에선 벡터의 내적, 벡터와 행렬의 곱, 행렬곱을 위해 '*'대신 'dot'함수를 사용합니다. 'dot'은 Numpy 모듈 함수로서도 배열 객체의 인스턴스 메소드로서도 이용 가능한 합수입니다:
~~~python
import numpy as np
@@ -709,83 +689,73 @@ y = np.array([[5,6],[7,8]])
v = np.array([9,10])
w = np.array([11, 12])
-# Inner product of vectors; both produce 219
+# 벡터의 내적; 둘 다 결과는 219
print v.dot(w)
print np.dot(v, w)
-# Matrix / vector product; both produce the rank 1 array [29 67]
+# 행렬과 벡터의 곱; 둘 다 결과는 rank 1 인 배열 [29 67]
print x.dot(v)
print np.dot(x, v)
-# Matrix / matrix product; both produce the rank 2 array
+# 행렬곱; 둘 다 결과는 rank 2인 배열
# [[19 22]
# [43 50]]
print x.dot(y)
print np.dot(x, y)
~~~
-Numpy provides many useful functions for performing computations on
-arrays; one of the most useful is `sum`:
+Numpy는 배열 연산에 유용하게 쓰이는 많은 함수를 제공합니다. 가장 유용한건 'sum'입니다:
~~~python
import numpy as np
x = np.array([[1,2],[3,4]])
-print np.sum(x) # Compute sum of all elements; prints "10"
-print np.sum(x, axis=0) # Compute sum of each column; prints "[4 6]"
-print np.sum(x, axis=1) # Compute sum of each row; prints "[3 7]"
+print np.sum(x) # 모든 요소를 합한 값을 연산; 출력 "10"
+print np.sum(x, axis=0) # 각 열에 대한 합을 연산; 출력 "[4 6]"
+print np.sum(x, axis=1) # 각 행에 대한 합을 연산; 출력 "[3 7]"
~~~
-You can find the full list of mathematical functions provided by numpy
-[in the documentation](http://docs.scipy.org/doc/numpy/reference/routines.math.html).
+Numpy가 제공하는 모든 수학함수들의 목록은 [문서](http://docs.scipy.org/doc/numpy/reference/routines.math.html)를 참조하세요.
-Apart from computing mathematical functions using arrays, we frequently
-need to reshape or otherwise manipulate data in arrays. The simplest example
-of this type of operation is transposing a matrix; to transpose a matrix,
-simply use the `T` attribute of an array object:
+배열연산을 하지 않더라도, 종종 배열의 모양을 바꾸거나 데이터를 처리해야할 때가 있습니다.
+가장 간단한 예는 행렬의 주대각선을 기준으로 대칭되는 요소끼리 뒤바꾸는 것입니다; 이를 전치라고 하며 행렬을 전치하기 위해선, 간단하게 배열 객체의 'T' 속성을 사용하면 됩니다:
~~~python
import numpy as np
x = np.array([[1,2], [3,4]])
-print x # Prints "[[1 2]
+print x # 출력 "[[1 2]
# [3 4]]"
-print x.T # Prints "[[1 3]
+print x.T # 출력 "[[1 3]
# [2 4]]"
-# Note that taking the transpose of a rank 1 array does nothing:
+# rank 1인 배열을 전치할경우 아무일도 일어나지 않습니다:
v = np.array([1,2,3])
-print v # Prints "[1 2 3]"
-print v.T # Prints "[1 2 3]"
+print v # 출력 "[1 2 3]"
+print v.T # 출력 "[1 2 3]"
~~~
-Numpy provides many more functions for manipulating arrays; you can see the full list
-[in the documentation](http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html).
+Numpy는 배열을 다루는 다양한 함수들을 제공합니다; 이러한 함수의 전체 목록은 [문서](http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html)를 참조하세요.
-### Broadcasting
-Broadcasting is a powerful mechanism that allows numpy to work with arrays of different
-shapes when performing arithmetic operations. Frequently we have a smaller array and a
-larger array, and we want to use the smaller array multiple times to perform some operation
-on the larger array.
-For example, suppose that we want to add a constant vector to each
-row of a matrix. We could do it like this:
+### 브로드캐스팅
+브로트캐스팅은 Numpy에서 shape가 다른 배열간에도 산술 연산이 가능하게 하는 메커니즘입니다. 종종 작은 배열과 큰 배열이 있을 때, 큰 배열을 대상으로 작은 배열을 여러번 연산하고자 할 때가 있습니다. 예를 들어, 행렬의 각 행에 상수 벡터를 더하는걸 생각해보세요. 이는 다음과 같은 방식으로 처리될 수 있습니다:
~~~python
import numpy as np
-# We will add the vector v to each row of the matrix x,
-# storing the result in the matrix y
+# 행렬 x의 각 행에 벡터 v를 더한 뒤,
+# 그 결과를 행렬 y에 저장하고자 합니다
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
-y = np.empty_like(x) # Create an empty matrix with the same shape as x
+y = np.empty_like(x) # x와 동일한 shape를 가지며 비어있는 행렬 생성
-# Add the vector v to each row of the matrix x with an explicit loop
+# 명시적 반복문을 통해 행렬 x의 각 행에 벡터 v를 더하는 방법
for i in range(4):
y[i, :] = x[i, :] + v
-# Now y is the following
+# 이제 y는 다음과 같습니다
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
@@ -793,167 +763,151 @@ for i in range(4):
print y
~~~
-This works; however when the matrix `x` is very large, computing an explicit loop
-in Python could be slow. Note that adding the vector `v` to each row of the matrix
-`x` is equivalent to forming a matrix `vv` by stacking multiple copies of `v` vertically,
-then performing elementwise summation of `x` and `vv`. We could implement this
-approach like this:
+위의 방식대로 하면 됩니다; 그러나 'x'가 매우 큰 행렬이라면, 파이썬의 명시적 반복문을 이용한 위 코드는 매우 느려질 수 있습니다. 벡터 'v'를 행렬 'x'의 각 행에 더하는것은 'v'를 여러개 복사해 수직으로 쌓은 행렬 'vv'를 만들고 이 'vv'를 'x'에 더하는것과 동일합니다. 이 과정을 아래의 코드로 구현할 수 있습니다:
~~~python
import numpy as np
-# We will add the vector v to each row of the matrix x,
-# storing the result in the matrix y
+# 벡터 v를 행렬 x의 각 행에 더한 뒤,
+# 그 결과를 행렬 y에 저장하고자 합니다
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
-vv = np.tile(v, (4, 1)) # Stack 4 copies of v on top of each other
-print vv # Prints "[[1 0 1]
- # [1 0 1]
- # [1 0 1]
- # [1 0 1]]"
-y = x + vv # Add x and vv elementwise
-print y # Prints "[[ 2 2 4
- # [ 5 5 7]
- # [ 8 8 10]
- # [11 11 13]]"
+vv = np.tile(v, (4, 1)) # v의 복사본 4개를 위로 차곡차곡 쌓은게 vv
+print vv # 출력 "[[1 0 1]
+ # [1 0 1]
+ # [1 0 1]
+ # [1 0 1]]"
+y = x + vv # x와 vv의 요소별 합
+print y # 출력 "[[ 2 2 4
+ # [ 5 5 7]
+ # [ 8 8 10]
+ # [11 11 13]]"
~~~
-Numpy broadcasting allows us to perform this computation without actually
-creating multiple copies of `v`. Consider this version, using broadcasting:
+Numpy 브로드캐스팅을 이용한다면 이렇게 v의 복사본을 여러개 만들지 않아도 동일한 연산을 할 수 있습니다.
+아래는 브로드캐스팅을 이용한 예시 코드입니다:
~~~python
import numpy as np
-# We will add the vector v to each row of the matrix x,
-# storing the result in the matrix y
+# 벡터 v를 행렬 x의 각 행에 더한 뒤,
+# 그 결과를 행렬 y에 저장하고자 합니다
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
-y = x + v # Add v to each row of x using broadcasting
-print y # Prints "[[ 2 2 4]
- # [ 5 5 7]
- # [ 8 8 10]
- # [11 11 13]]"
+y = x + v # 브로드캐스팅을 이용하여 v를 x의 각 행에 더하기
+print y # 출력 "[[ 2 2 4]
+ # [ 5 5 7]
+ # [ 8 8 10]
+ # [11 11 13]]"
~~~
-The line `y = x + v` works even though `x` has shape `(4, 3)` and `v` has shape
-`(3,)` due to broadcasting; this line works as if `v` actually had shape `(4, 3)`,
-where each row was a copy of `v`, and the sum was performed elementwise.
-
-Broadcasting two arrays together follows these rules:
+`x`의 shape가 `(4, 3)`이고 `v`의 shape가 `(3,)`라도 브로드캐스팅으로 인해 `y = x + v`는 문제없이 수행됩니다;
+이때 'v'는 'v'의 복사본이 차곡차곡 쌓인 shape `(4, 3)`처럼 간주되어 'x'와 동일한 shape가 되며 이들간의 요소별 덧셈연산이 y에 저장됩니다.
-1. If the arrays do not have the same rank, prepend the shape of the lower rank array
- with 1s until both shapes have the same length.
-2. The two arrays are said to be *compatible* in a dimension if they have the same
- size in the dimension, or if one of the arrays has size 1 in that dimension.
-3. The arrays can be broadcast together if they are compatible in all dimensions.
-4. After broadcasting, each array behaves as if it had shape equal to the elementwise
- maximum of shapes of the two input arrays.
-5. In any dimension where one array had size 1 and the other array had size greater than 1,
- the first array behaves as if it were copied along that dimension
+두 배열의 브로드캐스팅은 아래의 규칙을 따릅니다:
-If this explanation does not make sense, try reading the explanation
-[from the documentation](http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)
-or [this explanation](http://wiki.scipy.org/EricsBroadcastingDoc).
+1. 두 배열이 동일한 rank를 가지고 있지 않다면, 낮은 rank의 1차원 배열이 높은 rank 배열의 shape로 간주됩니다.
+2. 특정 차원에서 두 배열이 동일한 크기를 갖거나, 두 배열들 중 하나의 크기가 1이라면 그 두 배열은 특정 차원에서 *compatible*하다고 여겨집니다.
+3. 두 행렬이 모든 차원에서 compatible하다면, 브로드캐스팅이 가능합니다.
+4. 브로드캐스팅이 이뤄지면, 각 배열 shape의 요소별 최소공배수로 이루어진 shape가 두 배열의 shape로 간주됩니다.
+5. 차원에 상관없이 크기가 1인 배열과 1보다 큰 배열이 있을때, 크기가 1인 배열은 자신의 차원수만큼 복사되어 쌓인것처럼 간주된다.
+
+설명이 이해하기 부족하다면 [scipy문서](http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html)나 [scipy위키](http://wiki.scipy.org/EricsBroadcastingDoc)를 참조하세요.
-Functions that support broadcasting are known as *universal functions*. You can find
-the list of all universal functions
-[in the documentation](http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs).
+브로드캐스팅을 지원하는 함수를 *universal functions*라고 합니다.
+*universal functions* 목록은 [문서](http://docs.scipy.org/doc/numpy/reference/ufuncs.html#available-ufuncs)를 참조하세요.
-Here are some applications of broadcasting:
+브로드캐스팅을 응용한 예시들입니다:
~~~python
import numpy as np
-# Compute outer product of vectors
-v = np.array([1,2,3]) # v has shape (3,)
-w = np.array([4,5]) # w has shape (2,)
-# To compute an outer product, we first reshape v to be a column
-# vector of shape (3, 1); we can then broadcast it against w to yield
-# an output of shape (3, 2), which is the outer product of v and w:
+# 벡터의 외적을 계산
+v = np.array([1,2,3]) # v의 shape는 (3,)
+w = np.array([4,5]) # w의 shape는 (2,)
+# 외적을 게산하기 위해, 먼저 v를 shape가 (3,1)인 행벡터로 바꿔야 합니다;
+# 그다음 이것을 w에 맞춰 브로드캐스팅한뒤 결과물로 shape가 (3,2)인 행렬을 얻습니다,
+# 이 행렬은 v 와 w의 외적의 결과입니다:
# [[ 4 5]
# [ 8 10]
# [12 15]]
print np.reshape(v, (3, 1)) * w
-# Add a vector to each row of a matrix
+# 벡터를 행렬의 각 행에 더하기
x = np.array([[1,2,3], [4,5,6]])
-# x has shape (2, 3) and v has shape (3,) so they broadcast to (2, 3),
-# giving the following matrix:
+# x는 shape가 (2, 3)이고 v는 shape가 (3,)이므로 이 둘을 브로드캐스팅하면 shape가 (2, 3)인
+# 아래와 같은 행렬이 나옵니다:
# [[2 4 6]
# [5 7 9]]
print x + v
-# Add a vector to each column of a matrix
-# x has shape (2, 3) and w has shape (2,).
-# If we transpose x then it has shape (3, 2) and can be broadcast
-# against w to yield a result of shape (3, 2); transposing this result
-# yields the final result of shape (2, 3) which is the matrix x with
-# the vector w added to each column. Gives the following matrix:
+# 벡터를 행렬의 각 행에 더하기
+# x는 shape가 (2, 3)이고 w는 shape가 (2,)입니다.
+# x의 전치행렬은 shape가 (3,2)이며 이는 w와 브로드캐스팅이 가능하고 결과로 shape가 (3,2)인 행렬이 생깁니다;
+# 이 행렬을 전치하면 shape가 (2,3)인 행렬이 나오며
+# 이는 행렬 x의 각 열에 벡터 w을 더한 결과와 동일합니다.
+# 아래의 행렬입니다:
# [[ 5 6 7]
# [ 9 10 11]]
print (x.T + w).T
-# Another solution is to reshape w to be a row vector of shape (2, 1);
-# we can then broadcast it directly against x to produce the same
-# output.
+# 다른 방법은 w를 shape가 (2,1)인 열벡터로 변환하는 것입니다;
+# 그런다음 이를 바로 x에 브로드캐스팅해 더하면
+# 동일한 결과가 나옵니다.
print x + np.reshape(w, (2, 1))
-# Multiply a matrix by a constant:
-# x has shape (2, 3). Numpy treats scalars as arrays of shape ();
-# these can be broadcast together to shape (2, 3), producing the
-# following array:
+# 행렬의 스칼라배:
+# x 의 shape는 (2, 3)입니다. Numpy는 스칼라를 shape가 ()인 배열로 취급합니다;
+# 그렇기에 스칼라 값은 (2,3) shape로 브로드캐스트 될 수 있고,
+# 아래와 같은 결과를 만들어 냅니다:
# [[ 2 4 6]
# [ 8 10 12]]
print x * 2
~~~
-Broadcasting typically makes your code more concise and faster, so you
-should strive to use it where possible.
+브로드캐스팅은 보통 코드를 간결하고 빠르게 해줍니다, 그러므로 가능하다면 최대한 사용하세요.
### Numpy Documentation
-This brief overview has touched on many of the important things that you need to
-know about numpy, but is far from complete. Check out the
-[numpy reference](http://docs.scipy.org/doc/numpy/reference/)
-to find out much more about numpy.
+이 문서는 여러분이 numpy에 대해 알아야할 많은 중요한 사항들을 다루지만 완벽하진 않습니다.
+numpy에 관한 더 많은 사항은 [numpy 레퍼런스](http://docs.scipy.org/doc/numpy/reference/)를 참조하세요.
+
## SciPy
-Numpy provides a high-performance multidimensional array and basic tools to
-compute with and manipulate these arrays.
-[SciPy](http://docs.scipy.org/doc/scipy/reference/)
-builds on this, and provides
-a large number of functions that operate on numpy arrays and are useful for
-different types of scientific and engineering applications.
-The best way to get familiar with SciPy is to
-[browse the documentation](http://docs.scipy.org/doc/scipy/reference/index.html).
-We will highlight some parts of SciPy that you might find useful for this class.
+Numpy는 고성능의 다차원 배열 객체와 이를 다룰 도구를 제공합니다.
+numpy를 바탕으로 만들어진 [SciPy](http://docs.scipy.org/doc/scipy/reference/)는,
+numpy 배열을 다루는 많은 함수들을 제공하며 다양한 과학, 공학분야에서 유용하게 사용됩니다.
+
+SciPy에 익숙해지는 최고의 방법은 [SciPy 공식 문서](http://docs.scipy.org/doc/scipy/reference/index.html)를 보는 것입니다.
+이 문서에서는 scipy중 cs231n 수업에서 유용하게 쓰일 일부분만을 소개할것입니다.
-### Image operations
-SciPy provides some basic functions to work with images.
-For example, it has functions to read images from disk into numpy arrays,
-to write numpy arrays to disk as images, and to resize images.
-Here is a simple example that showcases these functions:
+
+### 이미지 작업
+SciPy는 이미지를 다룰 기본적인 함수들을 제공합니다.
+예를들자면, 디스크에 저장된 이미지를 numpy 배열로 읽어들이는 함수가 있으며,
+numpy 배열을 디스크에 이미지로 저장하는 함수도 있고, 이미지의 크기를 바꾸는 함수도 있습니다.
+이 함수들의 간단한 사용 예시입니다:
~~~python
from scipy.misc import imread, imsave, imresize
-# Read an JPEG image into a numpy array
+# JPEG 이미지를 numpy 배열로 읽어들이기
img = imread('assets/cat.jpg')
-print img.dtype, img.shape # Prints "uint8 (400, 248, 3)"
-
-# We can tint the image by scaling each of the color channels
-# by a different scalar constant. The image has shape (400, 248, 3);
-# we multiply it by the array [1, 0.95, 0.9] of shape (3,);
-# numpy broadcasting means that this leaves the red channel unchanged,
-# and multiplies the green and blue channels by 0.95 and 0.9
-# respectively.
+print img.dtype, img.shape # 출력 "uint8 (400, 248, 3)"
+
+# 각각의 색깔 채널을 다른 상수값으로 스칼라배함으로써
+# 이미지의 색을 변화시킬수 있습니다.
+# 이미지의 shape는 (400, 248, 3)입니다;
+# 여기에 shape가 (3,)인 배열 [1, 0.95, 0.9]를 곱합니다;
+# numpy 브로드캐스팅에 의해 이 배열이 곱해지며 붉은색 채널은 변하지 않으며,
+# 초록색, 파란색 채널에는 각각 0.95, 0.9가 곱해집니다
img_tinted = img * [1, 0.95, 0.9]
-# Resize the tinted image to be 300 by 300 pixels.
+# 색변경 이미지를 300x300 픽셀로 크기 조절.
img_tinted = imresize(img_tinted, (300, 300))
-# Write the tinted image back to disk
+# 색변경 이미지를 디스크에 기록하기
imsave('assets/cat_tinted.jpg', img_tinted)
~~~
@@ -961,94 +915,93 @@ imsave('assets/cat_tinted.jpg', img_tinted)
- Left: The original image.
- Right: The tinted and resized image.
+ Left: 원본 이미지.
+ Right: 색변경 & 크기변경 이미지.
-### MATLAB files
-The functions `scipy.io.loadmat` and `scipy.io.savemat` allow you to read and
-write MATLAB files. You can read about them
-[in the documentation](http://docs.scipy.org/doc/scipy/reference/io.html).
+
+### MATLAB 파일
+`scipy.io.loadmat` 와 `scipy.io.savemat`함수를 통해
+matlab 파일을 읽고 쓸 수 있습니다.
+[문서](http://docs.scipy.org/doc/scipy/reference/io.html)를 참조하세요.
-### Distance between points
-SciPy defines some useful functions for computing distances between sets of points.
-The function `scipy.spatial.distance.pdist` computes the distance between all pairs
-of points in a given set:
+### 두 점 사이의 거리
+SciPy에는 점들간의 거리를 계산하기 위한 유용한 함수들이 정의되어 있습니다.
+
+`scipy.spatial.distance.pdist`함수는 주어진 점들 사이의 모든 거리를 계산합니다:
~~~python
import numpy as np
from scipy.spatial.distance import pdist, squareform
-# Create the following array where each row is a point in 2D space:
+# 각 행이 2차원 공간에서의 한 점을 의미하는 행렬을 생성:
# [[0 1]
# [1 0]
# [2 0]]
x = np.array([[0, 1], [1, 0], [2, 0]])
print x
-# Compute the Euclidean distance between all rows of x.
-# d[i, j] is the Euclidean distance between x[i, :] and x[j, :],
-# and d is the following array:
+# x가 나타내는 모든 점 사이의 유클리디안 거리를 계산.
+# d[i, j]는 x[i, :]와 x[j, :]사이의 유클리디안 거리를 의미하며,
+# d는 아래의 행렬입니다:
# [[ 0. 1.41421356 2.23606798]
# [ 1.41421356 0. 1. ]
# [ 2.23606798 1. 0. ]]
d = squareform(pdist(x, 'euclidean'))
print d
~~~
-You can read all the details about this function
-[in the documentation](http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html).
+이 함수에 대한 자세한 사항은 [pidst 공식 문서](http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html)를 참조하세요.
-A similar function (`scipy.spatial.distance.cdist`) computes the distance between all pairs
-across two sets of points; you can read about it
-[in the documentation](http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html).
+`scipy.spatial.distance.cdist`도 위와 유사하게 점들 사이의 거리를 계산합니다. 자세한 사항은 [cdist 공식 문서](http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html)를 참조하세요.
+
## Matplotlib
-[Matplotlib](http://matplotlib.org/) is a plotting library.
-In this section give a brief introduction to the `matplotlib.pyplot` module,
-which provides a plotting system similar to that of MATLAB.
+[Matplotlib](http://matplotlib.org/)는 plotting 라이브러리입니다.
+이번에는 MATLAB의 plotting 시스템과 유사한 기능을 제공하는
+`matplotlib.pyplot` 모듈에 관한 간략한 소개가 있곘습니다.,
+
### Plotting
-The most important function in matplotlib is `plot`,
-which allows you to plot 2D data. Here is a simple example:
+matplotlib에서 가장 중요한 함수는 2차원 데이터를 그릴수 있게 해주는 `plot`입니다.
+여기 간단한 예시가 있습니다:
~~~python
import numpy as np
import matplotlib.pyplot as plt
-# Compute the x and y coordinates for points on a sine curve
+# 사인과 코사인 곡선의 x,y 좌표를 계산
x = np.arange(0, 3 * np.pi, 0.1)
y = np.sin(x)
-# Plot the points using matplotlib
+# matplotlib를 이용해 점들을 그리기
plt.plot(x, y)
-plt.show() # You must call plt.show() to make graphics appear.
+plt.show() # 그래프를 나타나게 하기 위해선 plt.show()함수를 호출해야만 합니다.
~~~
-Running this code produces the following plot:
+이 코드를 실행하면 아래의 그래프가 생성됩니다:
-With just a little bit of extra work we can easily plot multiple lines
-at once, and add a title, legend, and axis labels:
+약간의 몇가지 추가적인 작업을 통해 여러개의 그래프와, 제목, 범주, 축 이름을 한번에 쉽게 나타낼 수 있습니다:
~~~python
import numpy as np
import matplotlib.pyplot as plt
-# Compute the x and y coordinates for points on sine and cosine curves
+# 사인과 코사인 곡선의 x,y 좌표를 계산
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
-# Plot the points using matplotlib
+# matplotlib를 이용해 점들을 그리기
plt.plot(x, y_sin)
plt.plot(x, y_cos)
plt.xlabel('x axis label')
@@ -1061,37 +1014,38 @@ plt.show()
-You can read much more about the `plot` function
-[in the documentation](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot).
+`plot`함수에 관한 더 많은 내용은 [문서](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot)를 참조하세요.
+
### Subplots
-You can plot different things in the same figure using the `subplot` function.
-Here is an example:
+
+'subplot'함수를 통해 다른 내용들도 동일한 그림위에 나타낼수 있습니다.
+여기 간단한 예시가 있습니다:
~~~python
import numpy as np
import matplotlib.pyplot as plt
-# Compute the x and y coordinates for points on sine and cosine curves
+# 사인과 코사인 곡선의 x,y 좌표를 계산
x = np.arange(0, 3 * np.pi, 0.1)
y_sin = np.sin(x)
y_cos = np.cos(x)
-# Set up a subplot grid that has height 2 and width 1,
-# and set the first such subplot as active.
+# 높이가 2이고 너비가 1인 subplot 구획을 설정하고,
+# 첫번째 구획을 활성화.
plt.subplot(2, 1, 1)
-# Make the first plot
+# 첫번째 그리기
plt.plot(x, y_sin)
plt.title('Sine')
-# Set the second subplot as active, and make the second plot.
+# 두번째 subplot 구획을 활성화 하고 그리기
plt.subplot(2, 1, 2)
plt.plot(x, y_cos)
plt.title('Cosine')
-# Show the figure.
+# 그림 보이기.
plt.show()
~~~
@@ -1099,12 +1053,13 @@ plt.show()
-You can read much more about the `subplot` function
-[in the documentation](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot).
+`subplot`함수에 관한 더 많은 내용은
+[문서](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot)를 참조하세요.
-### Images
-You can use the `imshow` function to show images. Here is an example:
+
+### 이미지
+`imshow`함수를 사용해 이미지를 나타낼 수 있습니다. 여기 예시가 있습니다:
~~~python
import numpy as np
@@ -1114,20 +1069,21 @@ import matplotlib.pyplot as plt
img = imread('assets/cat.jpg')
img_tinted = img * [1, 0.95, 0.9]
-# Show the original image
+# 원본 이미지 나타내기
plt.subplot(1, 2, 1)
plt.imshow(img)
-# Show the tinted image
+# 색변화된 이미지 나타내기
plt.subplot(1, 2, 2)
-# A slight gotcha with imshow is that it might give strange results
-# if presented with data that is not uint8. To work around this, we
-# explicitly cast the image to uint8 before displaying it.
+# imshow를 이용하며 주의할 점은 데이터의 자료형이
+# uint8이 아니라면 이상한 결과를 보여줄수도 있다는 것입니다.
+# 그러므로 이미지를 나타내기 전에 명시적으로 자료형을 uint8로 형변환 해줍니다.
+
plt.imshow(np.uint8(img_tinted))
plt.show()
~~~
-
+
\ No newline at end of file