ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [NumPy] type()과 dtype, np.sum()과 np.multiply()
    Machine Learning/numpy & pandas & maplotlib 2023. 10. 3. 17:41

    * type() vs dtype

    type() 함수는 데이터타입을 알려주고,

    dtype은 ndarray의 attribute이다.

     

    * np.sum()과 np.multiply()

    np.multiply()는 두 개의 인자를 받아서 두 인자를 곱해준다.(np.float64, np.int 등, np.ndarray의 타입을 받을 수 있다.)

    인자가 array이면 product-wise를 수행하고, return값의 type으로 np.ndarray를 반환한다.

     

    np.sum()는 np.ndarray의 타입인 하나의 배열을 받아서, 내부 합을 계산한다. 

    axis값을 주어서 return값이 np.ndarray이면 return의 type()은 당연히, np.ndarray가 되고,

    axis값을 따로 주지 않으면, 전체 내부 합을 계산하여 return type으로 np.int64와 np.float64 등을 갖게 된다.

     

    * ndim

    a=np.array([3.14])
    print(a.ndim)	# 1
    print(type(a))	# <class 'numpy.ndarray'>
    print(a.dtype)	# float64
    print(a.shape)	# (1,)
    
    b=np.array(3.14)
    print(b.ndim)	# 0
    print(type(b))	# <class 'numpy.ndarray'>
    print(b.dtype)	# float64
    print(b.shape)	# ()

    ndim이 1이면 scalar 값과 연산시 broadcast 연산이 적용되고, 데이터 타입은 np.ndarray 그대로이다.

    ndim이 0이면 scalar값과 연산시 데이터 타입이 scalar의 데이터 타입으로 바뀐다.

     

    아래 예시에서 z+np.squeeze(b)는 np.float64와 np.ndarray의 연산인데, np.squeeze(b)의 ndim=0이므로 결과값의 type은 np.float64가 된다. 

    import numpy as np
    np.random.seed(1)
    a_slice_prev = np.random.randn(4, 4, 3)
    W = np.random.randn(4, 4, 3)
    b = np.random.randn(1, 1, 1)
    
    s = np.multiply(a_slice_prev,W)  
    z = np.sum(s)
    Z1 = np.squeeze(z+b) # b가 ndarray이므로 broadcast 연산으로 Z1은 배열이된다.
    Z2 = z+np.squeeze(b) 
    
    # b, squeeze 적용값
    k=np.squeeze(b) 
    print(type(k))	# <class 'numpy.ndarray'>
    print(k.ndim) 	# 배열의 차원은 0이다.
    print(k.dtype)	# float64
    print(k.shape)  # ()
    
    print("s")
    print(type(s))	# <class 'numpy.ndarray'>
    print(s.dtype)	# float64
    print(s.shape)	# (4, 4, 3)
    
    print("z")
    print(type(z))	# <class 'numpy.float64'>
    print(z.dtype)	# float64
    print(z.shape)	# ()
    
    print("Z1")
    print(type(Z1)) # <class 'numpy.ndarray'>
    print(Z1.dtype) # float64
    print(Z1.shape) # ()
    
    print("Z2")
    print(type(Z2)) # <class 'numpy.float64'>
    print(Z2.dtype) # float64
    print(Z2.shape) # ()
    
    assert (type(Z2) == np.float64), "You must cast the output to numpy float 64"
    assert np.isclose(Z2, -6.999089450680221), "Wrong value"

     

    댓글

Designed by Tistory.