2015-08-29 2 views
2

Я хотел бы получить некоторые отзывы о моем выборе структуры данных. У меня есть двумерная сетка X-Y текущих значений для определенного значения напряжения. У меня есть несколько шагов напряжения и организовал данные в куб X-Y-Voltage. Я проиллюстрировал топоры здесь: http://imgur.com/FVbluwB.Лучшая структура данных для использования в python для хранения 3-мерного куба с именованными данными

В настоящее время я использую массивы numpy в словарях python для различных транзисторов, которые я подметаю. Я не уверен, что это лучший способ сделать это. Я посмотрел на Панды, но я также не уверен, что это хорошая работа для Панд. Я надеялся, что кто-то поможет мне, поэтому я мог бы научиться быть питоническим! Код для генерации некоторых тестовых данных и конечной структуры приведен ниже.

Спасибо!

import numpy as np 

#make test data 

test__transistor_data0 = {"SNMOS":np.random.randn(3,256,256),"SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256),"WNMOS":np.random.randn(6,256,256)} 
test__transistor_data1 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)} 
test__transistor_data2 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)} 
test__transistor_data3 = {"SNMOS":np.random.randn(3,256,256), "SPMOS":np.random.randn(4,256,256), "WPMOS":np.random.randn(6,256,256), "WNMOS":np.random.randn(6,256,256)} 


quadrant_data = {"ne":test__transistor_data0,"nw":test__transistor_data1,"sw":test__transistor_data2,"se":test__transistor_data3} 
+1

Почему вы используете 'dict'? Я думаю, простой трехмерный 3D-массив будет работать нормально. – ZdaR

+0

Я не вижу проблемы с этой структурой. Это хорошо и чисто, что * * pythonic. Не зная своей реализации, трудно дать более конкретные рекомендации. Вы можете посмотреть [numpy.recarray] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.recarray.html), но я не уверен, что вы тоже этого хотите. – farenorth

+0

Незначительное: ваша строка 'quadrant_data' вряд ли будет прав, вы дублируете ключ« se »и не видите« nw ». – DSM

ответ

4

Это может быть стоит проверить xarray, которая, как (и частично на основе) pandas, но предназначены для N-мерных данных.

Его два основных контейнера - это DataArray, который представляет собой маркированную ND-матрицу и Dataset, который представляет собой контейнер DataArray.

In [29]: s1 = xray.DataArray(np.random.randn(3,256,256), dims=['voltage', 'x', 'y']) 

In [30]: s2 = xray.DataArray(np.random.randn(3,256,256), dims=['voltage', 'x', 'y']) 

In [32]: ds = xray.Dataset({'SNMOS': s1, 'SPMOS': s2}) 

In [33]: ds 
Out[33]: 
<xray.Dataset> 
Dimensions: (voltage: 3, x: 256, y: 256) 
Coordinates: 
    * voltage (voltage) int64 0 1 2 
    * x  (x) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 
    * y  (y) int64 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 
Data variables: 
    SPMOS (voltage, x, y) float64 -1.363 2.446 0.3585 -0.8243 -0.814 ... 
    SNMOS (voltage, x, y) float64 1.07 2.327 -1.435 0.4011 0.2379 2.07 ... 

Оба контейнера имеет много хорошей функциональность (см документации), например, если вы хотите знать максимальное значение x для каждого транзитер, на первый уровень напряжения, было бы что-то подобное :

In [39]: ds.sel(voltage=0).max(dim='x').max() 
Out[39]: 
<xray.Dataset> 
Dimensions: () 
Coordinates: 
    *empty* 
Data variables: 
    SPMOS float64 4.175 
    SNMOS float64 4.302 
+0

Это выглядит действительно круто. Благодаря! Мой вопрос был расплывчатым, потому что я не был уверен, чего я хочу, но способность маркировать разные оси данных очень полезна. – Josh

+0

ссылка мертва, а также старые названия проектов. Теперь это называется xarray, можно найти здесь: http://xarray.pydata.org/en/stable/ –

+0

В свою защиту это было более 2 лет назад :) - спасибо за комментарий, отредактировал имя/ссылку. – chrisb