클래스나 함수 선언을 보면 자주 input으로 array_like형 데이터 타입을 요구하는 경우가 많다. 그러나 array_like라고 하면 이해하기 힘든 경우가 많아 한번 정리하려고 한다.
Numpy의 공식 홈페이지에서는 다음과 같이 설명되어 있다.
array_like는 array로 해석될 수 있는 모든 scalar또는 sequence이다. 또한 여기에는 list(중첩과 다른 요소 유형을 포함하는)와 tuple 또한 포함된다.
일반적으로 파이썬에서 array_like 구조로 배열된 수치 데이터는 np.array()함수를 사용하여 array로 변환이 가능하다. 예시로는 tuple과 list가 있다. 따라서 가장 간단하게 array_like인지 확인 가능한 방법이다.
그러나 이러한 방법은 array_like가 무엇인지에 대한 확실한 정답을 내려주지는 않는다. 이는 array_like라는 단어가 입력이 무엇이 들어와야 하는지 정의하는 것이 아닌 입력을 설명하는 것에 가깝기 때문이다.
이는 Numpy에서 유연하게 데이터를 얻기 위해 이러한 형태로 만들었을 것이라 생각한다.
https://stackoverflow.com/questions/40378427/numpy-formal-definition-of-array-like-objects
numpy: formal definition of "array_like" objects?
In numpy, the constructors of many objects accept an "array_like" as first argument. Is there a definition of a such object, either as an abstract meta class, or documentation of the methods is sho...
stackoverflow.com
다음과 같은 stack overflow에서 소스코드를 분석하여 array_like가 무엇인지 확인하였다.
결과를 확인한다면 다음과 같은 input을 array_like라고 정의한다.
- Numpy array
- Numpy scalar
- Python scalar
- any object which supports the PEP 3118 buffer interface
- any object that supports the __array_struct__ or __array_interface__ interface
- any object that supplies the __array__ function
- Any object that can be treated as a list of lists
- 위의 것 중 하나에 해당하지 않으면 object dtype의 0차원 배열로 처리된다.
위와 같이 다양한 방법으로 처리되며 일일히 확인이 불가능하여 일반적으로 배열과 유사한 것은 모두 가능하다고 적어놓은 것 같다.
iterable은 파이썬 표준 용어로써 반복될 수 있는 모든 것을 나타낸다.
간단한 예를 들어 우리는 문자열을 변수에 넣어주면 이는 for 문을 통해 나올 수 있다.
여기서 한 가지 주의해야 할 점은 'array_like에 속해있는 대부분의 데이터 타입은 iterable 데이터 타입이니 iterable 데이터 타입이 array_like과 같나?'라는 생각을 할 수 있다.
간단한 예를 들어 반박 가능한데 스칼라 값은 array_like에 속해있지만 iterable한 데이터 타입이 아니다.
즉 a = 3은 np.array(a)에서 오류가 나오지 않지만 for문을 통해 돌리면 에러가 나온다.
또한 iterable 데이터 타입은 np.array를 통해서 Numpy array으로 만들수 없다.
iterable = (x*x for x in range(5))
iterable
#결과
<generator object <genexpr> at 0x7f6fafed06d0>
np.array(iterable)
#결과
array(<generator object <genexpr> at 0x7f6fafa93f50>, dtype=object)
np.fromiter(iterable, float)
#결과
array([ 0., 1., 4., 9., 16.])
다음의 결과를 보면 generator object인 iterable을 만들었다. 이를 np.array에 삽입하였으며 결과를 확인해 보면 object형태로 들어갔으며 배열을 형태가 나오지 않은 것을 볼 수 있다. 따라서 iterable 형태가 array_like이 아닌것을 확인 가능하다. 이러한 문제는 np.fromiter를 이용하여 해결 가능하다.
'Python > numpy' 카테고리의 다른 글
| 난수 생성 - numpy .random.permutation (0) | 2022.03.09 |
|---|---|
| 난수 생성 - np.random.seed, np.random.RandomState (0) | 2022.03.08 |