2016-07-02 4 views
0

Я немного новичок в среде python, и я передаю существующую программу MATLAB в Python. Я импортировал файл .mat, содержащий четыре поля, в которых меня интересует одно из 14 подполей массивов 11340x1, 11340x7 и 11340x8, а также несколько строк метеорологических данных. Я успешно импортировал данные, используя.mat to python data transfer

import scipy.io as sio 
import scipy 

MATfile = sio.loadmat(E:/JP/Meadowdata.mat) 

Теперь я хотел бы поставить эти массивы/строки в переменных для использования в Python. Я начал с

datagroup = MATfile['MAIN'] #for MAIN field 
T = datagroup['T'] #for Temp. 
P = datagroup['P'] #for Precip.... 

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

[[array([[-5.55555556], 
    [-5.55555556], 
    [-5.55555556], 
    ..., 
    [ 9.879  ], 
    [ 8.17  ], 
    [ 6.051  ]])]] 

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

Спасибо, jmatt

+0

Что делать, если вы позволите 'T = DataGroup [ 'T'] [0] [0] и' P = Датагруп [ 'P'] [0] [0] ', а затем проверить их длину? – edwinksl

+0

Что такое '.shape' и' .dtype' этих массивов? '.shape' является эквивалентом' size'. Массивы 'numpy' могут быть 0-мерными. – hpaulj

+0

Возможный дубликат: http://stackoverflow.com/questions/37996883/how-to-access-elements-of-numpy-ndarray. Позвольте мне знать, если это помогает. – hpaulj

ответ

0

Обратите внимание, что datagroup['T']datagroup['P']) представляет собой список из списка в numpy массива. Поэтому, если вы хотите, чтобы извлечь numpy массив, вам нужно сделать:

T = datagroup['T'][0][0] 
P = datagroup['P'][0][0] 
+0

Вам может потребоваться индексировать с помощью '[()]'. Проверьте 'shape' и' dtype'. 'loadmat' часто внедряет структуры MATLAB в массивы dtype с одним элементом. Это 0d, поэтому требуется специальная индексация. – hpaulj

0

У меня есть немного другой, а иногда и более стабильное решение.

Я нашел, что лучшим решением при перемещении данных между Matlab/Python является использование библиотеки экспорта JSON в matlab (например, this one), затем используйте библиотеку импорта JSON в python. Я обнаружил, что это немного более стабильно, чем функция загрузки .map scipy. Особенно если вы планируете часто импортировать или использовать какой-либо из более специфичных для Matlab типов переменных, таких как structs.

+0

Что передают матрицы MATLAB как? Вложенные списки? – hpaulj

+0

С собственной библиотекой json от Python, да, вложенными списками. Numira 'asarray()' легко превратит их в многомерный массив. –

0

я могу сделать массив, который печатает как ваш пример с:

In [1355]: A=np.array([[None]]) 
In [1356]: A[0,0]=np.array([[-5,-4,-3]]) 

In [1357]: A 
Out[1357]: array([[array([[-5, -4, -3]])]], dtype=object) 

In [1359]: print(A) 
[[array([[-5, -4, -3]])]] 

Это единственный элемент, 2d массив объектов, который содержит 2d числового массива. Есть несколько способов извлечения внутреннего массива:

In [1360]: A.item() 
Out[1360]: array([[-5, -4, -3]]) 

In [1362]: A[0,0] 
Out[1362]: array([[-5, -4, -3]]) 

In [1363]: A[0][0] 
Out[1363]: array([[-5, -4, -3]]) 

В других вопросах внешний массив 0d How to access elements of numpy ndarray?

In [1364]: B=np.array(None) 
In [1365]: B[()]=np.array([[1,2,3]]) 

In [1366]: B 
Out[1366]: array(array([[1, 2, 3]]), dtype=object) 

In [1367]: print(B) 
[[1 2 3]] 

In [1368]: B[()] 
Out[1368]: array([[1, 2, 3]]) 

In [1369]: B.item() 
Out[1369]: array([[1, 2, 3]]) 

item все еще работает.

Я не уверен, где различие возникает. У меня нет работы Octave на этой машине, поэтому не могу проверить, имеет ли значение V число.

Эта обучающая страница

http://students.mimuw.edu.pl/~pbechler/scipy_doc/tutorial/io.html

лучше, чем loadmat ссылка на страницу.

Вопросы задавать на любом уровне добычи, являются:

  • что это? Словарь, массив

  • если массив, что такое dtype? Объект? соединение (структурированное), числовое

  • Какая у него форма? Сколько измерений (ndim)?

+0

Спасибо всем. Эта многократная экстракция отлично работала. – Jmatt