2015-02-03 5 views
0

나는 data from a spread sheet 집합을 가지고 있습니다. 값은 xy 평면에서 자석의 자기장입니다. 다른 z 높이에 해당하는 여러 개의 레이어가 있습니다. 내 목표는이 작업을보다 쉽게 ​​수행 할 수 있도록 3 차원 배열을 만드는 것입니다.Numpy 다차원 배열은 1D 배열로만 등록합니다.

그러나 3D 배열을 구성 할 수 없습니다. 각 요소는 2 차원 행렬이지만 최종 결과는 1 차원 배열로만 등록됩니다 (아래 참조). 더 쉬운 숫자로 이것을 재현하려고 시도한 모든 시도는 동일한 효과를 보이지 않습니다 (3D 배열을 생성 할 수 있습니다).

정말 감사드립니다. 다음과 같이

내 코드는 다음과 같습니다

터미널에서
import xlrd 
import numpy as np 

book = xlrd.open_workbook('./magnetic_mapping.xlsx') 
sheet = book.sheet_by_index(0) 
n = 0 
layer = [] 
layers = [] 
layer_name = None 

#import pudb; pudb.set_trace() 

while True: 
    row = sheet.row_values(n) 
    # Look for the start of a new layer, reading a line with nothing 
    # will throw an IndexError, reading a line with a number will throw 
    # an AttributionError. 
    try: 
     if row[0].split()[0] == 'Layer': 
      # If we are already reading in data from a layer, save it before 
      # starting a new layer 
      if layer_name: 
       layers.append(np.array(layer)) 
      layer_name = row[0] 
      print layer_name 
      layer = [] 
    except (IndexError, AttributeError): 
     # If we are in a layer, and the line is not empty, read in the data 
     if layer_name and row[0]: 
      data = np.array(row[2:], dtype='S9') 
      data[data == ''] = np.nan   # convert empty strings to nan 
      layer.append(data.astype(float)) 

    # Break loop if at EOF, otherwise increment the spreadsheet row. 
    if row[0] == 'END': 
     break 
    else: 
     n+=1 

# append the last layer recorded 
layers.append(np.array(layer)) 
layers = np.array(layers) 

:

In [1]: layers.shape 
Out[1]: (7,) 

In [2]: layers[0].shape 
Out[2]: (27, 13) 

답변

1

문제는 '레이어'일치하지 않는 모양 가지고있다 :

print([ll.shape for ll in layers]) 
# [(27, 13), (25, 13), (25, 13), (25, 13), (25, 13), (25, 13), (25, 13)] 

첫 번째 '레이어를 '에는 27 개의 행이 있고 나머지에는 25 개의 행이 있습니다.이 불일치를 어떻게 처리 할 것인지는 당신에게 달려 있습니다. 예를 들어, 모든 작은 레이어를 NaN으로 채워서 가장 큰 레이어와 동일한 크기로 만듭니다. 순간을 위해, 신속하고 더러운 해킹은 첫 번째 레이어의 행을 절단 할 수 있습니다 : 나는 세 번째 차원을 따라 층을 연결하는 np.dstack을 사용하고

layers[0] = layers[0][1:-1] 
arr = np.dstack(layers) 
print(arr.shape) 
# (25, 13, 7) 

참고. np.array(layers)을 사용하는 경우 np.object 유형의 (7,) 배열을 얻습니다. 이는 아마도 원하는 것이 아닙니다.

+0

dstack에 호의를 표합니다. – Ben