2017-04-24 1 views
6

나는 간단한 요소 목록을 가지고 있으며, 그 중 structured array을 만들려고 노력하고 있습니다.목록에서 구조화 된 배열 만들기

이 순진하게 접근 방식은 실패 튜플의 각 요소를 넣는

y = np.array([1,2,3], dtype=[('y', float)]) 
TypeError: expected an object with a buffer interface 

작동 : 내가 먼저 목록에서 배열을 만들 경우 그것은 또한 작동

# Manuel way 
y = np.array([(1,), (2,), (3,)], dtype=[('y', float)]) 
# Comprehension 
y = np.array([tuple((x,)) for x in [1,2,3]], dtype=[('y', float)]) 

:

y = np.array(np.array([1,2,3]), dtype=[('y', float)]) 

나는 약간 당황 스럽다. 후자는 어떻게 작동합니까? numpy는 단순한 목록을 제공 할 때 항목을 정렬 할 수 없습니까?

추천 방법은 무엇입니까? 해당 중간에 array을 만들면 성능에 큰 영향을 미치지 않을 수 있지만 이는 차선책이 아닙니까?

나는 또한 그 작동하지 않습니다 놀랍 :

# All lists 
y = np.array([[1,], [2,], [3,]], dtype=[('y', float)]) 
TypeError: expected an object with a buffer interface 
# All tuples 
y = np.array(((1,), (2,), (3,)), dtype=[('y', float)]) 
ValueError: size of tuple must match number of fields. 

나는 구조 배열에 새로운 그리고 난 입력 유형에 대한 그 까다롭게 numpy을 기억하지 않습니다. 내가 잃어버린 뭔가가있을거야.

+0

행 구조적 배열의 각 요소는 * 구조체 *이기 때문에, 복합 데이터 유형의 일종이 있기 때문에, 튜플을 사용하여 할당 될 필요가 있기 때문에. 대안은 버퍼를 사용하는 것입니다 (이것이'np.array'가 작동하는 이유입니다). –

+0

일종의 문서입니다. [here] (https://docs.scipy.org/doc/numpy/user/basics.rec.html#filling-structured-arrays) –

+0

이전 문서 섹션에서는'x가 튜플리스트로 만들었습니다 .' 이 입력 스타일은 표시 스타일과 일치합니다. 나는 목록 이해력 접근법을 선호한다. 또는 미리 할당 된 배열 필드를 필드로 채 웁니다. – hpaulj

답변

3

np.array이 다양한 입력을 처리하는 방법에 대한 세부 정보는 컴파일 된 코드에 묻혀 있습니다. 객체 dtype 배열을 만드는 것에 대한 많은 질문이 나타나기 때문에 복잡하고 혼란 스러울 수 있습니다. 기본 모델은 중첩 목록에서 다차원 숫자 배열을 만드는 것입니다.

np.array([[1,2,3],[4,5,6]]) 

는 구조화 된 배열을 구현하는 개발자는 또 다른 중첩 된 차원에서 레코드를 구별하는 방법으로 tuple을 채택했다. 이는 구조화 된 배열의 표시에서 분명합니다.

list of tuples 요구 사항이 설명서에 다소 묻혀 있지만 구조화 된 배열을 정의 할 때도 필요합니다.

In [382]: dt=np.dtype([('y',int)]) 
In [383]: np.array(alist,dt) 

TypeError: a bytes-like object is required, not 'int' 

이것은 내 버전 '1.12.0'오류 메시지입니다. 그것은 당신에게서 다른 것처럼 보입니다.

목록 이해는 네스트 목록을 튜플 목록으로 변환 할 수 있다는 점에 유의하십시오.

In [384]: np.array([tuple(i) for i in alist],dt) 
Out[384]: 
array([(1,), (2,), (3,)], 
     dtype=[('y', '<i4')]) 

자주 묻는 질문에 답하는 것은 내가 가장 자주 사용하는 접근 방식입니다. 그 중 하나 또는 preallocated 배열의 필드를 반복적으로 설정 (일반적으로 필드보다 훨씬 많은 레코드가 있으므로 루프가 비싸지 않습니다).

In [385]: np.array(np.array(alist),dt) 
Out[385]: 
array([[(1,)], 
     [(2,)], 
     [(3,)]], 
     dtype=[('y', '<i4')]) 
In [386]: np.array(alist).astype(dt) 
Out[386]: 
array([[(1,)], 
     [(2,)], 
     [(3,)]], 
     dtype=[('y', '<i4')]) 

그러나 차원 수의 변화를주의 :이 구조적 배열 통화 어레이 배치 같다

astype 호 동등하다. 튜플의 목록은 (3,) 배열을 만들었습니다. astype(3,1) 숫자 배열을 (3,1) 구조적 배열로 변환했습니다.

튜플이 np.array이라고 말하는 부분은 배열 크기와 레코드 '여기'사이에 구분을 넣습니다.그것은 해석

[(3,), (1,), (2,)] 
[record, record, record] 

DTYPE이 (비 구조화 된)은 목록 튜플

In [388]: np.array([tuple(i) for i in alist],int) 
Out[388]: 
array([[1], 
     [2], 
     [3]]) 

그러나 사이의 구별을 무시 숫자 인 경우

[[record],[record],[record]] 

을 생산할 수 [[1],[2],[3]]의 자동 번역 등 dtype이 컴파운드 인 경우 개발자는 튜플 레이어를 중요한 정보로 사용하도록 선택했습니다.


보다 복잡한 구조 DTYPE

In [389]: dt1=np.dtype([('y',int,(2,))]) 
In [390]: np.ones((3,), dt1) 
Out[390]: 
array([([1, 1],), ([1, 1],), ([1, 1],)], 
     dtype=[('y', '<i4', (2,))]) 
In [391]: np.array([([1,2],),([3,4],)]) 
Out[391]: 
array([[[1, 2]], 

     [[3, 4]]]) 
In [392]: np.array([([1,2],),([3,4],)], dtype=dt1) 
Out[392]: 
array([([1, 2],), ([3, 4],)], 
     dtype=[('y', '<i4', (2,))]) 

표시 (입력)리스트 내의 튜플 내의 목록을 가지고 있다면. 그리고 단지 개시에게있어

In [393]: dt1=np.dtype([('x',dt,(2,))]) 
In [394]: dt1 
Out[394]: dtype([('x', [('y', '<i4')], (2,))]) 
In [395]: np.ones((2,),dt1) 
Out[395]: 
array([([(1,), (1,)],), ([(1,), (1,)],)], 
     dtype=[('x', [('y', '<i4')], (2,))]) 

convert list of tuples to structured numpy array

+0

이 포괄적 인 답변을 주셔서 감사합니다. 지금은 더 이해가됩니다. 겸손한 경험 에서처럼 numpy는 놀랍지 않게 "나는 과학자가 아니고 파이썬이없는 배경과 할 일이 많지 않다"고 놀랍지 만 조금 놀랐습니다. 구조화 된 배열을 조작하려면 내부에서 일어나는 일에 대한 예방 조치와 이해가 훨씬 필요합니다. –

관련 문제