2013-01-07 4 views
1

기존의 배열을 여러 개의 명명 된 필드로 가져 와서 원래 dtype과 동일한 계층 적 dtype을 가진 하나의 필드로 새 배열을 만들거나 변경하십시오. 즉 oldarray 여기numpy 구조화 된 배열에 계층 구조 추가

발 모양과 구조가 동일하다

newarray = np.array(oldarray, dtype=[('old',oldarray.dtype)]) 

같은 newarray['old'] 것을하는 예이다 :

In [1]: import numpy as np 

In [2]: dt = np.dtype([('name',np.str_,2),('val',np.float_)]) 

In [3]: constants = np.array([('pi',3.14),('e',2.72)],dtype=dt) 

In [4]: constants 
Out[4]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [5]: numbers = constants.astype([('constants',dt)]) 

하지만 날 모두 제로 준다 :

In [6]: numbers 
Out[6]: 
array([(('', 0.0),), (('', 0.0),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

을 복사본을 만들려고해도 같은 문제가 발생합니다.

In [7]: numbers = np.array(constants,dtype=[('constants',dt)]) 

In [8]: numbers 
Out[8]: 
array([(('', 0.0),), (('', 0.0),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

또한 : 사람이 이런 일이 이유 알고 있나요?

내가 원래 배열의 목록을 만들어 문제를 해결할 수

답변

2

:

>>> import numpy as np 
>>> dt = np.dtype([('name',np.str_,2),('val',np.float_)]) 
>>> constants = np.array([('pi',3.14),('e',2.72)],dtype=dt) 
>>> 
>>> numbers = constants.view([('constants',dt)]) 
>>> 
>>> numbers['constants'] 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

결과 배열 numbers은 원본 배열의보기이므로 하나의 변경 사항은 다른 배열에도 영향을 미칩니다.

+0

감사합니다. @joris, 이것이 완벽합니다. 뷰를 사용하면 실제로 배열을 내부적으로 변경할 수 있습니다 :'constants = constants.view ([('constants', dt)])' – askewchan

0

:

In [9]: numbers = np.array([constants],dtype=[('constants',dt)]) 

In [10]: numbers 
Out[10]: 
array([[(('pi', 3.14),), (('e', 2.72),)]], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

을하지만 내가 볼 때, 물론 나는 목록에 추가 중첩이 있습니다

In [11]: numbers['constants'] 
Out[11]: 
array([[('pi', 3.14), ('e', 2.72)]], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [12]: numbers['constants']['name'] 
Out[12]: 
array([['pi', 'e']], 
     dtype='|S2') 

In [13]: numbers[0] 
Out[13]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

나는 또한 배열 AF를 병합하여이 작업을 수행 할 수 있습니다 : 정말 그냥 목록의 첫 번째 항목을 원하는 terward :

In [14]: numbers.flatten() 
Out[14]: 
array([(('pi', 3.14),), (('e', 2.72),)], 
     dtype=[('constants', [('name', '|S2'), ('val', '<f8')])]) 

In [15]: numbers.flatten()['constants'] 
Out[15]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [16]: numbers.flatten()['constants']['name'] 
Out[16]: 
array(['pi', 'e'], 
     dtype='|S2') 

해킹이 아닙니까? 마지막으로 실제로 원하는 것은 배열입니다.

In [17]: numbers = np.array([(('pi', 3.14),), (('e', 2.72),)],dtype=[('constants',dt)]) 

In [18]: numbers['constants'] 
Out[18]: 
array([('pi', 3.14), ('e', 2.72)], 
     dtype=[('name', '|S2'), ('val', '<f8')]) 

In [19]: numbers['constants']['name'] 
Out[19]: 
array(['pi', 'e'], 
     dtype='|S2') 

단일 항목 목록을 만든 다음이를 병합하지 않아도됩니다. 더 좋은 아이디어?

당신은 새로운 DTYPE (http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html)와 원래 배열의 view를 취할 수