기록하는 습관

[Numpy] 001. Numpy와 ndarray 본문

Python/Numpy

[Numpy] 001. Numpy와 ndarray

Avalla 2023. 8. 3. 12:59

Numpy

파이썬은 대표적인 동적 타이핑 언어이며, 변수를 선언할 때 데이터 타입을 명시하지 않고 값을 할당하면 해당 변수의 데이터 타입이 자동으로 결정된다. 그러나 C로 구현된 넘파이는 동적 타이핑을 지원하지 않는다. 즉, 배열 생성 시에 배열의 요소들의 데이터 타입을 명시해야 한다.

대신 연산 속도가 빠르다는 장점이 있다. (단, Concat 같은 할당 작업에는 연산 속도의 이점이 없음) 일반적으로 속도 순서는 다음과 같다. (1억 번 루프마다 4배 이상의 성능 차이)

  • for loop < list comprehension < Numpy

하나의 데이터타입만 가능하다보니 각 엘레먼트마다 할당되는 메모리도 같고, 각 타입 별 메모리 값은 C랑 동일하다.

아래는 리스트와 ndarray의 가장 큰 차이점을 보여준다.

import numpy as np
a = [0, 1000]
b = [1000, 0]
print( a[0] is b[-1] )
print( a[0] == b[-1] )
print( b[0] is a[-1] )
print( b[0] == a[-1] )
True
True
False
True
a = np.array([0,1000])
b = np.array([1000,0])
print( a[0] is b[-1] )
print( a[0] == b[-1] )
print( b[0] is a[-1] )
print( b[0] == a[-1] )
False
True
False
True

np.array()

Docstring:

array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0,
like=None)

  • Numpy는 List와 달리 데이터 타입이 유일해야 함
print( np.array([1, 2, 3]) )
print( np.array([1, 2, 3.0]) )
print( np.array([1, 2.0, "3"]) )
print( type(np.array([1, 2.0, "3"])) )
[1 2 3]
[1. 2. 3.]
['1' '2.0' '3']
<class 'numpy.ndarray'>
print( np.array([1, 2.0, "3"], dtype="str") )
print( np.array([1, 2.0, "3"], dtype="int") )
print( np.array([1, 2.0, "3"], dtype="float") )
['1' '2.0' '3']
[1 2 3]
[1. 2. 3.]
print( np.array([np.array(1), np.array(1)], dtype="int") )
print( np.array([[1,'2'], np.array([1,2])], dtype="float") )
[1 1]
[[1. 2.]
 [1. 2.]]

object 또한 dtype으로 설정 가능

print( np.array(([1],2,3), dtype="float") )
[1. 2. 3.]



---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-4-056d3273be5f> in <module>
      1 print( np.array((1,2,3), dtype="float") )
----> 2 print( np.array(([1],2,3), dtype="float") )


ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (3,) + inhomogeneous part.
print( np.array(([1],2,3), dtype="object") )
print( np.array([np.array(1),[3]], dtype="object") )
[list([1]) 2 3]
[array(1) list([3])]

np.ndarray 속성

array = np.array([range(10), range(10)])
print( array )
print( "type(array) :", type(array) )
print( "array.ndim :", array.ndim )
print( "array.shape :", array.shape )
print( "array.size :", array.size )
print( "array.dtype :", array.dtype )
[[0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]]
type(array) : <class 'numpy.ndarray'>
array.ndim : 2
array.shape : (2, 10)
array.size : 20
array.dtype : int32