2013-04-04 3 views
8

Есть ли способ способ хранения (x, y), (x, y, z) или (x, y, z, t) данных в python?Есть ли стандартный способ хранения данных XY в python?

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

Я видел использование 2 списков, застегнутых на молнию, на какой стороне все это делается при использовании numpy.

XY_data = zip([x for x in range(0,10)] , [y for y in range(0,10)]) 

Есть ли стандарт? Если нет, то какой у вас любимый способ, или тот, который вы видели больше всего?

+0

Вы спрашиваете о пространственных координатах конкретно, или любых произвольных данных? –

+0

Для меня я спрашиваю о пространственных координатах. Тем не менее, я уверен, что если у вас есть какая-либо информация об интернет-сообществе, вы с удовольствием узнаете. – chase

+1

Замечание: '[x for x in range (0,10)]' идентично просто 'range (10)' – askewchan

ответ

5

Один прекрасный способ с structured array. Это дает все преимущества массивов numpy, но удобная структура доступа.

Все, что вам нужно сделать, чтобы ваш массив numpy был «структурированным», должен дать ему аргумент dtype. Это дает каждому «поле» имя и тип. Они могут даже иметь более сложные формы и иерархии, если вы хотите, но вот как я держу е-у данных:

In [175]: import numpy as np 

In [176]: x = np.random.random(10) 

In [177]: y = np.random.random(10) 

In [179]: zip(x,y) 
Out[179]: 
[(0.27432965895978034, 0.034808254176554643), 
(0.10231729328413885, 0.3311112896885462), 
(0.87724361175443311, 0.47852682944121905), 
(0.24291769332378499, 0.50691735432715967), 
(0.47583427680221879, 0.04048957803763753), 
(0.70710641602121627, 0.27331443495117813), 
(0.85878694702522784, 0.61993945461613498), 
(0.28840423235739054, 0.11954319357707233), 
(0.22084849730366296, 0.39880927226467255), 
(0.42915612628398903, 0.19197320645915561)] 

In [180]: data = np.array(zip(x,y), dtype=[('x',float),('y',float)]) 

In [181]: data['x'] 
Out[181]: 
array([ 0.27432966, 0.10231729, 0.87724361, 0.24291769, 0.47583428, 
     0.70710642, 0.85878695, 0.28840423, 0.2208485 , 0.42915613]) 

In [182]: data['y'] 
Out[182]: 
array([ 0.03480825, 0.33111129, 0.47852683, 0.50691735, 0.04048958, 
     0.27331443, 0.61993945, 0.11954319, 0.39880927, 0.19197321]) 

In [183]: data[0] 
Out[183]: (0.27432965895978034, 0.03480825417655464) 

Другие, вероятно, предполагают, используя pandas, но если ваши данные относительно простые, простой NumPy может быть проще.

Вы можете добавить иерархию, если хотите, но часто это сложнее, чем необходимо.

Например:

In [200]: t = np.arange(10) 

In [202]: dt = np.dtype([('t',int),('pos',[('x',float),('y',float)])]) 

In [203]: alldata = np.array(zip(t, zip(x,y)), dtype=dt) 

In [204]: alldata 
Out[204]: 
array([(0, (0.27432965895978034, 0.03480825417655464)), 
     (1, (0.10231729328413885, 0.3311112896885462)), 
     (2, (0.8772436117544331, 0.47852682944121905)), 
     (3, (0.242917693323785, 0.5069173543271597)), 
     (4, (0.4758342768022188, 0.04048957803763753)), 
     (5, (0.7071064160212163, 0.27331443495117813)), 
     (6, (0.8587869470252278, 0.619939454616135)), 
     (7, (0.28840423235739054, 0.11954319357707233)), 
     (8, (0.22084849730366296, 0.39880927226467255)), 
     (9, (0.429156126283989, 0.1919732064591556))], 
     dtype=[('t', '<i8'), ('pos', [('x', '<f8'), ('y', '<f8')])]) 

In [205]: alldata['t'] 
Out[205]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 

In [206]: alldata['pos'] 
Out[206]: 
array([(0.27432965895978034, 0.03480825417655464), 
     (0.10231729328413885, 0.3311112896885462), 
     (0.8772436117544331, 0.47852682944121905), 
     (0.242917693323785, 0.5069173543271597), 
     (0.4758342768022188, 0.04048957803763753), 
     (0.7071064160212163, 0.27331443495117813), 
     (0.8587869470252278, 0.619939454616135), 
     (0.28840423235739054, 0.11954319357707233), 
     (0.22084849730366296, 0.39880927226467255), 
     (0.429156126283989, 0.1919732064591556)], 
     dtype=[('x', '<f8'), ('y', '<f8')]) 

In [207]: alldata['pos']['x'] 
Out[207]: 
array([ 0.27432966, 0.10231729, 0.87724361, 0.24291769, 0.47583428, 
     0.70710642, 0.85878695, 0.28840423, 0.2208485 , 0.42915613]) 
+0

Спасибо, я этого раньше не видел. Таким образом, по существу, используя как массивы zipping, так и numpy, создается другой тип данных, называемый структурированным массивом? В чем преимущество панд над numpy? – chase

+0

Я еще не использовал pandas, но он немного более эффективен для множества разных группировок и фильтрации на ваших наборах данных. Если вы знакомы с методами numpy и находите их недостающими, посмотрите на pandas, но я бы начал с простого numpy. Другие, конечно, не согласятся :) – askewchan

Смежные вопросы