2017-09-05 88 views
-1

我在加載一個在Matlab中創建的.mat文件到Python中時遇到了一個奇怪的事情,與scipy.io.loadmat。我發現在其他帖子中提到了類似的「陣列結構」,但沒有解釋它們。此外,我找到了解決這個問題的方法,但我想了解爲什麼 Python(或scipy.io.loadmat)以這種方式處理文件。Python中單元素數組的數組:爲什麼?

比方說,我創建在Matlab細胞,並將其保存:

my_data = cell(dim1, dim2); 
% Fill my_data with strings and floats... 
save('my_data.mat','my_data') 

現在我把它加載到的Python:

import scipy.io as sio 
data = sio.loadmat('my_data.mat')['my_data'] 

現在data的類型爲numpy.ndarraydtypeobject。當我看到一個切片,它可能是這個樣子:

data[0] 
>>> array([array(['Some descriptive string'], dtype='<U13'), 
      array([[3.141592]]), array([[2.71828]]), array([[4.66920]]), etc. 
      ], dtype=object). 

爲什麼會出現這種情況?爲什麼Python/sio.loadmat創建一個單元素數組的數組,而不是一個浮點數組(假設我刪除了包含字符串的第一列)?

對不起,如果我的問題是基本的,但我真的想了解什麼似乎是不必要的複雜。

+1

如何在Matlab中填寫my_data? – Szabolcs

+0

在MATLAB中,不存在不是數組的變量。單值變量是1x1矩陣。單元是一個數組,可以包含任何在MATLAB中。我假設這種行爲來自具有數值的單元格並在python中加載。你在MATLAB中需要一個單元嗎?如果將它保存爲矩陣,您將避免此行爲。 –

+1

我第二@AnderBiguri。 Matlab中的單元格可以將任何*作爲元素。同樣,'dtype = object'數組可以將任何*作爲元素。 'loadmat'根本不夠聰明,無法確定在特定情況下所有* any都是浮點數。最好儘量不要使用單元格和對象數組。 – kazemakase

回答

1

正如評論說:

這種行爲來,因爲要保存細胞,「陣列」,它可以包含內部的任何物件。你用大小爲1x1的矩陣填充(浮點數)。

這就是python給你的。 的nparray,其內部有1x1陣列。

Python正在做着MATLAB正在做的事情。對於這個例子,你應該避免在MATLAB中使用單元格。

+0

謝謝@Ander Biguri。顯示爲已解決。 –