
x= np.arange(15).reshape(3,5)
y = np.arange(0,150,10).reshape(3,5)
x
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
y
>array([[ 0, 10, 20, 30, 40],
[ 50, 60, 70, 80, 90],
[100, 110, 120, 130, 140]])
리스트의 경우
a=[1,2,3,4]
b=2
c=[100,200,300,400]
a*2
>[10, 20, 30, 40, 10, 20, 30, 40]
a+c
>[10, 20, 30, 40, 100, 200, 300, 400]
array 연산은 리스트와 달리 기본적으로 ‘원소’끼리의 연산이다
x+y
>array([[ 0, 11, 22, 33, 44],
[ 55, 66, 77, 88, 99],
[110, 121, 132, 143, 154]])
x-y
>array([[ 0, -9, -18, -27, -36],
[ -45, -54, -63, -72, -81],
[ -90, -99, -108, -117, -126]])
array 와 스칼라 값 연산 가능
x+10
>array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
단일값만 갖고 있는 객체와는 shape 관계없이, scalar 연산 수행
x+[[10]]
>array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
x+np.array([10])
>array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
x+np.array(10)
>array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
그러나
x+np.array([10,20])
#ValueError:operands could not be broadcast together with shapes (3,5) (
numpy의 많은 함수들은 axis= 파라미터를 가진다.
axis(축)은 각 ‘차원’을 의미한다
1차원 array 라면 각 차원에 대한 axis 값은 0 (1개)
2차원 array라면 각 차원에 대한 axis 값은 0,1 (2개)
3차원 array라면 각 차원에 대한 axis 값은 0,1,2 (3개)
axis= 값을 명시하면 그 함수의 연산은 해당 axis에 따라서 연산을 수행한다.
x1 = np.arange(15)
x1
>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
np.sum(x1)
>105
np.sum(x1,axis=None)
>105
x2 = x1.reshape(3,5)
x2
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
axis 설정하여 합을구하면
x2.shape
>(3,5)
np.sum(x2)
>105
np.sum(x2,axis=0)
>array([15, 18, 21, 24, 27])
⇒(3,5)→(5,) 즉 0번째 axis 가 제거된거임
np.sum(x2,axis=1)
>array([10, 35, 60])
np.sum(x2,axis=-1)
>array([10, 35, 60])
⇒(3,5)→(3,) 즉 0번째 axis 가 제거된거임
x = np.arange(15).reshape(3,5)
x
>array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
y = np.random.rand(15).reshape(3,5)
y
>array([[0.69187711, 0.31551563, 0.68650093, 0.83462567, 0.01828828],
[0.75014431, 0.98886109, 0.74816565, 0.28044399, 0.78927933],
[0.10322601, 0.44789353, 0.9085955 , 0.29361415, 0.28777534]])
x+y
> array([[ 0.69187711, 1.31551563, 2.68650093, 3.83462567, 4.01828828],
[ 5.75014431, 6.98886109, 7.74816565, 8.28044399, 9.78927933],
[10.10322601, 11.44789353, 12.9085955 , 13.29361415, 14.28777534]])
shape가 다른 경우
a = np.arange(12).reshape(4,3)
b = np.arange(100,103)
a #(4,3)
>array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
b #(3,)
>array([100, 101, 102])
a+b
>array([[100, 102, 104],
[103, 105, 107],
[106, 108, 110],
[109, 111, 113]])
Shape 이 같거나
차원 중 값이 1이 존재하면
⇒가능!!
c = np.arange(1000,1004)
c
>array([1000,1001,1002,1003])
print(a.shape)
print(c.shape)
>(4,3)
(4,)
=> broadcasting 불가
a = np.full(4,100) #(4,)
a
>array([100,100,100,100])
a+1
>array([101, 101, 101, 101])
a+[1] #(4,) + (1,)
>array([101, 101, 101, 101])
b = np.arange(1,9).reshape(2,4)
b
>array([[1, 2, 3, 4],
[5, 6, 7, 8]])
a+b
>array([[101, 102, 103, 104],
[105, 106, 107, 108]])
array 인덱싱 시에 bool 리스트를 전달하여 True 인 경우만 필터링한다
for 사용x고도 array에서 조건에 맞는 데이터만 추출 하는 기능
x = np.random.rnadint(1,100,size=10)
x
>array([28, 38, 58, 84, 39, 9, 33, 35, 11, 24])
x%2
>array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0])
even_mask = x%2==0
even_mask
>array([ True, True, True, True, False, False, False, False, False,
True])
→bool 값으로 이루어진 array를 Mask 라고도 한다.
x[even_mask]
>array([28, 38, 58, 84, 24])
list 나 tuple 같은 iterable도 boolmask로 사용 가능하다
x[[ True, True, True, True, False, False, False, False, False, True]]
>array([28, 38, 58, 84, 24])
x[(x%2==0) & (x<30)]
>array([28,24])
True, int(True),False,int(False)
>(True,1,False,0)
x>50
>array([False, False, True, True, False, False, False, False, False,
False])
(x>50).astype(int)
>array([0, 0, 1, 1, 0, 0, 0, 0, 0, 0])
(x>50).astype(int).sum()
>2
True+True
2