2016-10-26 4 views
1

I 파이썬 사전 최 항목 두 소자 어레이 어디 다음과 같이 정의되어있다 :다차원 배열

mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}} 

제가 지금 필요한 것은 모든 0 번째 요소를 형성하는 것이다 새로운 배열, 즉, ​​[:, :, 0] 또는 [..., 0]를 사용해 [1,3,5,6]을 돌려주는 그러나 [:, :, 0] 또는 [..., 0]은이 경우 아래와 같이 작동하지 않습니다. 다음과 같은 출력을 제공

import numpy as np 
    import pandas as pd 
    a = np.array(pd.DataFrame.from_dict(mydict)) 
    print a 

는 :

[[[1, 2] [5, 6]] 
    [[3, 4] [7, 8]]] 

은 이것이 2x2x2 배열 것 같다. 별도의 대괄호를 사용하여 해당 요소에 액세스하는 데 아무런 문제가 없습니다. 예 : [0] [0] [0]은 1을 반환합니다. 그러나 [0,0,0]은 오류를 발생시킵니다. 하지만 내가 필요로하는 것이 내 목표를 달성하기 위해 2x2x2 배열입니다 -

--------------------------------------------------------------------------- 
    IndexError        Traceback (most recent call last) 
    <ipython-input-150-f68aba7de42a> in <module>() 
    ----> 1 a[0,0,0] 

    IndexError: too many indices for array 

두 요소의 배열은 2 × 2 배열의 요소로 간주됩니다 것으로 보인다. 이 방법을 2x2x2 배열로 변환 할 수있는 방법이 있습니까?

+1

@ 트렁크, 나는 혼란 스럽다고 생각합니다. 'a'는 3D numpy 배열입니다. 가장 안쪽에있는 원소가리스트 형이 아닌 경우'a [0,0,0]'가 완전하게 유효합니다. 'a [0,0] [0]'가 작동합니다. – wflynny

+0

아, 그래, 네 말이 맞아. – trincot

+0

귀하의 질문에 혼란이 있습니다. 먼저'[1,3,5,6]'과 같은 결과를 요구하지만, 2x2x2 배열을 요청합니다. 어느 쪽을 원하니? – trincot

답변

5

귀하의 문제는 pandas가 초기 항목 (목록)을 개체로 취급하므로 numpy 배열로 변환 할 때 가장 안쪽의 항목이 목록 개체입니다.

> b = np.array(map(np.array, a.flat)).reshape(2,2,2) 
> b.shape 
(2, 2, 2) 
> b[0,0,0] 
1 

편집 : 심지어 간단한 : 당신이 원하는 경우

> b = np.array(a.tolist()) 
array([[[1, 2], 
     [5, 6]], 

     [[3, 4], 
     [7, 8]]]) 

예를 들어,

> type(a) 
numpy.ndarray 
> type(a[0]) 
numpy.ndarray 
> type(a[0,0]) 
list 

당신은 당신이 궁극적으로 원하는 모양 (2x2x2), 당신은 항상 할 수를 알고있는 경우 각 가장 안쪽 행의 첫 번째 항목, 예. 1,3,5,7이면 원하는 모양에 따라 b[...,0] 또는 b[...,0].flatten()을 사용할 수 있습니다.

+0

또는 매핑을 피하거나 목록을 만들지 않으려면 스택 작업 :'np.hstack (np.hstack (a))'을 사용하십시오. – Divakar

1

각 사전 요소를 파고 각 하위 사전을 파고 각각의 리프 목록의 첫 번째 요소를 추출해야합니다. 파이썬 목록으로

a = [mydict[x][y][0] for y in mydict[x] for x in mydict] 

결과 :

[1, 3, 5, 7] 

나는 이것이 당신이 실제로 원하는 것을 믿습니다.

+1

나는 OP가 판다/numpy를 사용하고 싶어한다고 생각한다. 솔루션은 주문을 보존하지 않습니다. sorted (mydict [k0] .keys())]에서 k1에 대해 정렬 된 (mydict.keys())의 k0에 대한 [[mydict [k0] [k1] [0]] ' –

+0

바닐라 사전 고유 한 순서는 없습니다. 그래도 코드가 추가되었습니다. 또한 설명하기 위해 목록을 사용했습니다. OP는 이미 numpy로 변환하는 방법을 알고 있습니다. – Prune

+0

물론 일반 dict은 고유 한 순서는 없습니다 (단, Python 3.6의 dict는 실제로 순서를 유지하지만). 그러나이 특정 dict (및 하위 dicts)는 숫자 키를 사용합니다. OP가 숫자를 사용하려고한다고 가정합니다. 그 열쇠의 순서. –

2

는 팬더없이 나는 당신의 배열을 다시 만들 수 있습니다 :

In [1723]: mydict = {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}} 
In [1724]: mydict 
Out[1724]: {1: {1: [1, 2], 2: [3, 4]}, 2: {1: [5, 6], 2: [7, 8]}} 
In [1725]: mydict[1] 
Out[1725]: {1: [1, 2], 2: [3, 4]} 
In [1726]: mydict[2] 
Out[1726]: {1: [5, 6], 2: [7, 8]} 
In [1727]: a=np.empty((2,2),dtype=object) 
In [1728]: for i in range(2): 
     ...:  for j in range(2): 
     ...:   a[i,j]=mydict[i+1][j+1] 
     ...:   
In [1729]: a 
Out[1729]: 
array([[[1, 2], [3, 4]], 
     [[5, 6], [7, 8]]], dtype=object) 
In [1730]: print(a) 
[[[1, 2] [3, 4]] 
[[5, 6] [7, 8]]] 

이 마지막 인쇄가 당신과 동일합니다. 이 배열의

요소는 3 차원 배열로 바뀔 때까지 easist 방법

In [1735]: a[0,1] 
Out[1735]: [3, 4] 
In [1736]: type(a[0,1]) 
Out[1736]: list 

tolist 함께 나열하다 :

In [1737]: a.tolist() 
Out[1737]: [[[1, 2], [3, 4]], [[5, 6], [7, 8]]] 
In [1738]: np.array(a.tolist()) 
Out[1738]: 
array([[[1, 2], 
     [3, 4]], 

     [[5, 6], 
     [7, 8]]]) 
In [1739]: _.shape 
Out[1739]: (2, 2, 2) 
# dtype('int32') 

tolist 중첩 된 목록으로 배열 언팩; 그런 다음 np.array은 해당 목록 구조에서 최대 차원 배열을 만듭니다.