Почему MATLAB 2D Char Array превращается в массив Python 1D? - PullRequest
0 голосов
/ 28 июня 2018

Я использую Scipy для загрузки 2D-матрицы MATLAB в Python. В MATLAB MAT - это матрица 32x40 Char. В каждом индексе есть один символ. Однако при загрузке в Python он становится (32,) numpy array, в котором все символы теперь обрабатываются как 32 строки строк вместо 32 строк символов с максимальной длиной 40 символов. Как мне разбить этот массив из 32 строк обратно в двумерный массив с 32 строками и 40 столбцами символов?

a = np.array([])
matdata = spio.loadmat(misspath)
a = np.append(a, matdata['D_package'])
a_data = matdata['a_data']

Python numpy (32,):

Out[545]: 
array([['PLPBTKNLYLHDFWVCEVTTNMTTBFFVAGLDEGHFFFTP'],
['PRiDAEo    rooWEnaFFDAKAuSOrRERltrAFFCCeo'],
['FltRGFUrAGFtwSxxLLLLLrIAossDGDPAAAAsw'],
[' FKDDFWa plG iiFDGGSSD\x00\x02u3t te\x003411te'],
.....

Оригинал MATLAB (32,40):

val = 
PLPBTKNLYLHDFWVCEVTTNMTTBFFVAGLDEGHFFFTP
PRiDAEo    rooWEnaFFDAKAuSOrRERltrAFFCCeo
FltRGFUrAGFtwSxxLLLLLrIAossDGDPAAAAsw
 FKDDFWa plG iiFDGGSSD\x00\x02u3t te\x003411te
....

1 Ответ

0 голосов
/ 29 июня 2018

До тех пор, пока в R2016b MATLAB не имел строку типа данных, но хранил строки как символьные векторы , и именно так большинство кода MATLAB по-прежнему пишется. Поэтому loadmat обоснованно предполагает, что n -мерный массив символов из MATLAB должен интерпретироваться как n-1 -мерный массив строк.

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

>>> a = numpy.array([ ['hot'],['foo'],['pie'] ])

array([['hot'],
       ['foo'],
       ['pie']],
      dtype='<U3')

>>> numpy.array([[c for c in w[0]] for w in a])

array([['h', 'o', 't'],
   ['f', 'o', 'o'],
   ['p', 'i', 'e']],
  dtype='<U1')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...