2012-06-27 53 views
9

Có thể có một mảng bản ghi 3-D ở dạng khối không? (Có thể điều này là không thể, hoặc đơn giản chỉ là một cách dễ dàng hơn để làm những việc quá - tôi mở cho các tùy chọn khác).mảng bản ghi numpy 3d

Giả sử tôi muốn một mảng chứa dữ liệu cho 3 biến (nói tạm thời, precip, độ ẩm) và dữ liệu của mỗi biến thực sự là mảng 2-d 2 năm (hàng) và 6 tháng dữ liệu (cột), tôi có thể tạo ra điều đó như thế này:

>>> import numpy as np 

>>> d = np.array(np.arange(3*2*6).reshape(3,2,6)) 
>>> d 

# 
# comments added for explanation... 
#  jan feb mar apr may Jun  

array([[[ 0, 1, 2, 3, 4, 5], # yr1 temp 
     [ 6, 7, 8, 9, 10, 11]], # yr2 temp 

     [[12, 13, 14, 15, 16, 17], # yr1 precip 
     [18, 19, 20, 21, 22, 23]], # yr2 precip 

     [[24, 25, 26, 27, 28, 29], # yr1 humidity 
     [30, 31, 32, 33, 34, 35]]]) # yr2 humidity 

tôi muốn để có thể gõ:

>>> d['temp'] 

và có được điều này (người đầu tiên "trang" của dữ liệu):

>>> array([[ 0, 1, 2, 3, 4, 5], 
      [ 6, 7, 8, 9, 10, 11]]) 

hay:

>>> d['Jan'] # assume months are Jan-June 

và có được điều này

>>> array([[0,6], 
      [12,18], 
      [24,30]]) 

Tôi đã từng trải qua điều này: http://www.scipy.org/RecordArrays một số lần, nhưng không thấy cách thiết lập những gì tôi sau đó.

Trả lời

12

Thực ra, bạn có thể làm điều gì đó tương tự như vậy với mảng có cấu trúc, nhưng thường gặp nhiều rắc rối hơn giá trị của nó.

Điều bạn muốn về cơ bản là các nhãn có nhãn.

Pandas (được xây dựng trên đầu numpy) cung cấp những gì bạn muốn và là lựa chọn tốt hơn nếu bạn muốn loại lập chỉ mục này. Ngoài ra còn có Larry (for labeled array), nhưng phần lớn nó được thay thế bởi Pandas.

Ngoài ra, bạn nên xem tài liệu gọn gàng cho mảng có cấu trúc để biết thông tin về điều này, thay vì Câu hỏi thường gặp. Tài liệu sần sần có nhiều thông tin hơn. http://docs.scipy.org/doc/numpy/user/basics.rec.html

Nếu bạn muốn thực hiện tuyến đường thuần túy, lưu ý rằng mảng có cấu trúc có thể chứa mảng đa chiều. (Lưu ý đối số hình dạng khi chỉ định dtype.) Điều này sẽ nhanh chóng trở nên phức tạp hơn so với giá trị của nó.

Trong pandas thuật ngữ, những gì bạn muốn là Panel. Tuy nhiên, bạn có lẽ là get familiar with DataFrames.

Đây là cách bạn muốn làm điều đó với Pandas:

import numpy as np 
import pandas 

d = np.array(np.arange(3*2*6).reshape(3,2,6)) 

dat = pandas.Panel(d, items=['temp', 'precip', 'humidity'], 
         major_axis=['yr1', 'yr2'], 
         minor_axis=['jan', 'feb', 'mar', 'apr', 'may', 'jun']) 

print dat['temp'] 
print dat.major_xs('yr1') 
print dat.minor_xs('may') 
+0

hmm, ok, mà một phần xác nhận sự nhầm lẫn của tôi. Gấu trúc trông lý tưởng, cảm ơn! – tbc