[파이썬] Array creation routines - 기존 데이터를 이용한 ndarray 생성

InAnarchy·2023년 4월 20일
0

numpy

목록 보기
4/4
post-thumbnail

기존 데이터를 이용한 ndarray 생성

numpy.asarray

  • input을 ndarray로 변환
  • ndarray의 데이터 타입이 설정되어있다면, 데이터 형태가 다를 경우에만 복사됨
numpy.asarray(a, dtype=None, order=None, *, like=None)
a = [1, 2]
np.asarray(a) #array([1, 2])

리스트를 배열로 바꾸었다

a = np.array([1,2])
np.asarray(a) is a #True

존재하는 배열은 복사되지 않는다

a = np.array([1, 2], dtype=np.float32)
np.asarray(a, dtype=np.float32) is a #True

데이터 타입이 같을 때는 복사하지 않는다

a = np.array([1, 2], dtype=np.float32)
np.asarray(a, dtype=np.float64) is a #False

데이터 타입이 다를 때 복사한다

array, asarray

  • array는 원본이 변경될 때 복사본은 변경되지 않는다
  • asarray는 원본이 변경되면 복사본도 변경된다.
a = np.zeros([2, 5])

arr = np.array(a)
asarr = np.asarray(a) 

a[0] = 3
print(arr)
print()
print(asarr)

numpy.asfarray

  • 배열을 float type으로 변환한다
  • 데이터타입이 int라면, float64로 바뀐다.
numpy.asfarray(a, dtype=<class 'numpy.double'>)
np.asfarray([2, 3]) #array([2., 3.])
np.asfarray([2, 3], dtype='float') #array([2., 3.])
np.asfarray([2, 3], dtype='int8') #array([2., 3.])

numpy.asanyarray

  • input을 ndarray로 변환한다.
  • input data는 스칼라, 리스트, 튜플, ndarray의 형태 모두 가능
numpy.asanyarray(a, dtype=None, order=None, *, like=None)
my_list = [1, 3, 5, 7, 9]
print ("Input  list : ", my_list)
print(type(my_list))

out_arr = np.asanyarray(my_list)
print ("output array from input list : ", out_arr)  #List to array
print(type(out_arr))
Input  list :  [1, 3, 5, 7, 9]
<class 'list'>
output array from input list :  [1 3 5 7 9]
<class 'numpy.ndarray'>
my_tuple = ([1, 3, 5, 7, 9],[1,2,3,4,5])
print ("Input  list : ", my_tuple)
print(type(my_tuple))

out_arr = np.asanyarray(my_tuple)
print ("output array from input list : ", out_arr) # tuple to array
print(type(out_arr))
Input  list :  ([1, 3, 5, 7, 9], [1, 2, 3, 4, 5])
<class 'tuple'>
output array from input list :  [[1 3 5 7 9]
 [1 2 3 4 5]]
<class 'numpy.ndarray'>
my_scalar = 12
print ("Input  list : ", my_scalar)
print(type(my_scalar))

out_arr = np.asanyarray(my_scalar)
print ("output array from input list : ", out_arr)  #scalar to array
print(type(out_arr))
print(out_arr.shape)
print(out_arr.ndim)
Input  list :  12
<class 'int'>
output array from input list :  12
<class 'numpy.ndarray'>
()
0
a = np.array([(1.0, 2), (3.0, 4)], dtype='f4,i4').view(np.recarray)
np.asanyarray(a) is a #Instances of ndarray subclasses are passed through as-is:

numpy.ascontiguousarray

  • C-style contiguous(연속) 배열로 변환
  • 기존 배열의 데이터를 새로운 연속된 메모리 블록에 복사하고, 새로운 배열을 반환
numpy.ascontiguousarray(a, dtype=None, *, like=None)
my_list = [100, 200, 300, 400, 500]
  
print ("Input  list : ", my_list)
print(type(my_list)) 

out_arr = np.ascontiguousarray(my_list, dtype = np.float32)
print ("output array from input list : ", out_arr) 
print(type(out_arr))
Input  list :  [100, 200, 300, 400, 500]
<class 'list'>
output array from input list :  [100. 200. 300. 400. 500.]
<class 'numpy.ndarray'>

list->ndarray

my_tuple = ([2, 6, 10], [8, 12, 16])
  
print ("Input  list : ", my_tuple)
print(type(my_tuple)) 

out_arr = np.ascontiguousarray(my_tuple, dtype = np.int32)
print ("output array from input list : ", out_arr) 
print(type(out_arr))
Input  list :  ([2, 6, 10], [8, 12, 16])
<class 'tuple'>
output array from input list :  [[ 2  6 10]
 [ 8 12 16]]
<class 'numpy.ndarray'>

tuple->ndarraty

my_scalar = 100
   
print ("Input  scalar : ", my_scalar)
print(type(my_scalar)) 

out_arr = np.ascontiguousarray(my_scalar, dtype = np.float32)
print ("output array from input list : ", out_arr) 
print(type(out_arr))
Input  scalar :  100
<class 'int'>
output array from input list :  [100.]
<class 'numpy.ndarray'>

scalar->ndarray

numpy.asfortranarray

numpy.asfortranarray(a, dtype=None, *, like=None)
my_list = [1, 3, 5, 7, 9]
 
print ("Input  list : ", my_list)
print(type(my_list))

out_arr = np.asfortranarray(my_list)
print ("output fortranarray from input list : ", out_arr)
print(type(out_arr))
Input  list :  [1, 3, 5, 7, 9]
<class 'list'>
output fortranarray from input list :  [1 3 5 7 9]
<class 'numpy.ndarray'>
my_tuple = ([1, 3, 9], [8, 2, 6])
  
print ("Input  tuple : ", my_tuple)
   
out_arr = np.asfortranarray(my_tuple, dtype ='int8')
print ("output fortran array from input tuple : ", out_arr)
Input  tuple :  ([1, 3, 9], [8, 2, 6])
output fortran array from input tuple :  [[1 3 9]
 [8 2 6]]
my_scalar = 15
  
print ("Input  scalar : ", my_scalar)
   
out_arr = np.asfortranarray(my_scalar, dtype ='float')
print ("output fortran array from input scalar : ", out_arr)
Input  scalar :  15
output fortran array from input scalar :  [15.]
in_arr = np.arange(9).reshape(3, 3)
  
print ("Input  array : ", in_arr)
 
# checking if it is fortranarray
print(in_arr.flags['F_CONTIGUOUS'])
 
out_arr = np.asfortranarray(in_arr, dtype ='float')
print ("output array from input array : ", out_arr)
 
# checking if it has become fortranarray
print(out_arr.flags['F_CONTIGUOUS'])
Input  array :  [[0 1 2]
 [3 4 5]
 [6 7 8]]
False
output array from input array :  [[0. 1. 2.]
 [3. 4. 5.]
 [6. 7. 8.]]
True

numpy.fromiter

  • iterable 객체에서 1차원 배열을 생성
  • count: 객체에서 읽어올 아이템의 개수. 디폴트는 -1(모두 다 읽어옴)
numpy.fromiter(iter, dtype, count=-1, *, like=None)
iterable = (x * x*x for x in range(4))
print(type(iterable))

gfg = np.fromiter(iterable, int)
  
print(gfg)
print(type(gfg))
<class 'generator'>
[ 0  1  8 27]
<class 'numpy.ndarray'>
iterable = (x * x for x in range(6))
print(type(iterable))

gfg = np.fromiter(iterable, float)
  
print(gfg)
print(type(gfg))
<class 'generator'>
[ 0.  1.  4.  9. 16. 25.]
<class 'numpy.ndarray'>

numpy.fromfunction

  • 주어진 함수를 사용하여 지정된 shape의 배열을 생성
  • 함수의 인자로 배열의 인덱스를 받아서 해당 인덱스에 대응하는 값을 계산하고, 그 결과를 배열에 저장
  • 특정 규칙에 따라 값을 생성하는 배열을 만들 때 유용

Construct an array by executing a function over each coordinate.
The resulting array therefore has a value fn(x, y, z) at coordinate (x, y, z).

numpy.fromfunction(function, shape, *, dtype=<class 'float'>, like=None, **kwargs)

function: callable
shape(N,): tuple of ints

np.fromfunction(lambda i, j: i, (2, 2), dtype=float)
array([[0., 0.],
       [1., 1.]])

lambda i, j: i 를 사용하여 2x2 크기의 배열을 생성
배열의 인덱스 i를 받아서 i 값을 반환

첫 번째 행의 값은 0으로, 두 번째 행의 값은 1로 채워진 2x2 크기의 배열

np.fromfunction(lambda i, j: j, (2, 2), dtype=float)  
array([[0., 1.],
       [0., 1.]])

인덱스 j를 받아서 j값을 반환
첫 번째 열의 값은 0으로, 두 번째 열의 값은 1로 채워진 2x2 크기의 배열

np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
array([[ True, False, False],
        [False,  True, False],
       [False, False,  True]])

배열의 대각선 요소에 해당하는 인덱스에서만 True 값을 반환

def my_function(x, y):
    return x * y

arr = np.fromfunction(my_function, (5, 5), dtype=int)

print(arr)
[[ 0  0  0  0  0]
 [ 0  1  2  3  4]
 [ 0  2  4  6  8]
 [ 0  3  6  9 12]
 [ 0  4  8 12 16]]
profile
No sibal Keep going.

0개의 댓글