簡體   English   中英

編寫可在Matlab中讀取的3D Numpy數組

[英]Writing a 3d numpy array that is readable in matlab

我正在嘗試將3D numpy數組保存到磁盤上,以便以后可以在matlab中讀取它。 我在3D數組上使用numpy.savetxt()時遇到了一些困難,因此我的解決方案是先使用以下代碼將其轉換為1D數組:

import numpy

array = numpy.array([[0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])

ndarray = numpy.dstack((array, array, array))

darray = ndarray.reshape(36,1)

numpy.savetxt('test.txt', darray, fmt = '%i')

然后在matlab中可以使用以下代碼讀取它:

file = fopen('test.txt')
array = fscanf(file, '%f')

我現在的問題是將其轉換回原始形狀。 使用reshape(array, 3,4,3)產生以下結果:

ans(:,:,1) =

     0     1     2     3
     0     1     2     3
     0     1     2     3


ans(:,:,2) =

     0     1     1     3
     0     1     1     3
     0     1     1     3


ans(:,:,3) =

     3     1     3     1
     3     1     3     1
     3     1     3     1

我試圖轉置1D matlab數組,然后使用reshape()但得到相同的數組。

我可以應用什么matlab函數來實現原始的python數組?

您想permute尺寸。 numpy這是transpose 有兩個並發症-MATLAB矩陣的“ F”階和顯示模式,使用最后一個維度上的塊(這是F階的外部)。 跳轉到該答案的末尾以獲取詳細信息。

===

In [72]: arr = np.array([[0, 1, 2, 3],
    ...:        [0, 1, 1, 3],
    ...:        [3, 1, 3, 1]])
    ...:        
In [80]: np.dstack((arr,arr+1))
Out[80]: 
array([[[0, 1],
        [1, 2],
        [2, 3],
        [3, 4]],

       [[0, 1],
        [1, 2],
        [1, 2],
        [3, 4]],

       [[3, 4],
        [1, 2],
        [3, 4],
        [1, 2]]])
In [81]: np.dstack((arr,arr+1)).shape
Out[81]: (3, 4, 2)

In [75]: from scipy.io import loadmat, savemat
In [76]: pwd
Out[76]: '/home/paul/mypy'
In [83]: savemat('test3',{'arr':arr, 'arr3':arr3})

在八度

>> load 'test3.mat'
>> arr
arr =

  0  1  2  3
  0  1  1  3
  3  1  3  1

>> arr3
arr3 =

ans(:,:,1) =

  0  1  2  3
  0  1  1  3
  3  1  3  1

ans(:,:,2) =

  1  2  3  4
  1  2  2  4
  4  2  4  2

>> size(arr3)
ans =

   3   4   2

回到numpy我可以使用2個3x4塊顯示數組:

In [95]: arr3[:,:,0]
Out[95]: 
array([[0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])
In [96]: arr3[:,:,1]
Out[96]: 
array([[1, 2, 3, 4],
       [1, 2, 2, 4],
       [4, 2, 4, 2]])

將這些數組分解為1d(實際上顯示了基礎數據緩沖區中值的布局):

In [100]: arr.ravel()
Out[100]: array([0, 1, 2, 3, 0, 1, 1, 3, 3, 1, 3, 1])
In [101]: arr3.ravel()
Out[101]: 
array([0, 1, 1, 2, 2, 3, 3, 4, 0, 1, 1, 2, 1, 2, 3, 4, 3, 4, 1, 2, 3, 4, 1, 2])

八度中的相應旅行:

>> arr(:).'
ans =
  0  0  3  1  1  1  2  1  3  3  3  1

>> arr3(:).'
ans =
  0  0  3  1  1  1  2  1  3  3  3  1  1  1  4  2  2  2  3  2  4  4  4  2

MATLAB使用F(fortran)順序,第一維的變化最快。 因此,顯示塊arr(:,:i)是很自然的。 您可以在創建和使用numpy數組時指定order='F' 但是,要保持順序整齊可能會很棘手,尤其是在使用3d時。 loadmat/savemat嘗試為我們做一些重新排序。 例如,二維MATLAB矩陣在numpy作為F數組加載。


In [107]: np.array([0,0,3,1,1,1,2,1,3,3,3,1])
Out[107]: array([0, 0, 3, 1, 1, 1, 2, 1, 3, 3, 3, 1])
In [108]: np.array([0,0,3,1,1,1,2,1,3,3,3,1]).reshape(4,3)
Out[108]: 
array([[0, 0, 3],
       [1, 1, 1],
       [2, 1, 3],
       [3, 3, 1]])
In [109]: np.array([0,0,3,1,1,1,2,1,3,3,3,1]).reshape(4,3).T
Out[109]: 
array([[0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])
In [111]: np.array([0,0,3,1,1,1,2,1,3,3,3,1]).reshape((3,4),order='F')
Out[111]: 
array([[0, 1, 2, 3],
       [0, 1, 1, 3],
       [3, 1, 3, 1]])

使用此數組可能更容易跟蹤形狀:

In [112]: arr3 = np.arange(2*3*4).reshape(2,3,4)
In [113]: arr3f = np.arange(2*3*4).reshape(2,3,4, order='F')
In [114]: arr3
Out[114]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])
In [115]: arr3f
Out[115]: 
array([[[ 0,  6, 12, 18],
        [ 2,  8, 14, 20],
        [ 4, 10, 16, 22]],

       [[ 1,  7, 13, 19],
        [ 3,  9, 15, 21],
        [ 5, 11, 17, 23]]])
In [116]: arr3f.ravel()
Out[116]: 
array([ 0,  6, 12, 18,  2,  8, 14, 20,  4, 10, 16, 22,  1,  7, 13, 19,  3,
        9, 15, 21,  5, 11, 17, 23])
In [117]: arr3f.ravel(order='F')
Out[117]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])
In [118]: savemat('test3',{'arr3':arr3, 'arr3f':arr3f})

在八度音階中:

>> arr3
arr3 =
ans(:,:,1) =
   0   4   8
  12  16  20

ans(:,:,2) =
   1   5   9
  13  17  21
....
>> arr3f
arr3f =
ans(:,:,1) =
   0   2   4
   1   3   5

ans(:,:,2) =
   6   8  10
   7   9  11
...
>> arr3.ravel()'
error: int32 matrix cannot be indexed with .
>> arr3(:)'
ans =
 Columns 1 through 20:
   0  12   4  16   8  20   1  13   5  17   9  21   2  14   6  18  10  22   3  15
 Columns 21 through 24:
   7  19  11  23
>> arr3f(:)'
ans =
 Columns 1 through 20:
   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
 Columns 21 through 24:
  20  21  22  23

當按塊打印時, arr3f仍然看起來像“ messedup”,但是當被弄亂時,我們看到值是相同的F順序。 如果我們打印numpy數組的最后一個“塊”,這也很明顯:

In [119]: arr3f[:,:,0]
Out[119]: 
array([[0, 2, 4],
       [1, 3, 5]])

因此,要匹配numpy和matlab,我們必須保持兩件事直截了當-順序和塊顯示樣式。

我MATLAB是生疏,但我發現permute與類似於np.transpose 使用它來重新排列尺寸:

>> permute(arr3,[3,2,1])
ans =
ans(:,:,1) =
   0   4   8
   1   5   9
   2   6  10
   3   7  11

ans(:,:,2) =
  12  16  20
  13  17  21
  14  18  22
  15  19  23
>> permute(arr3,[3,2,1])(:)'
ans =
 Columns 1 through 20:
   0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19
 Columns 21 through 24:
  20  21  22  23

等效的numpy轉置

In [121]: arr3f.transpose(2,1,0).ravel()
Out[121]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19, 20, 21, 22, 23])

(對不起的回答,很抱歉。我可能會對其進行編輯。希望它能為您提供一些幫助。)

===

讓我們嘗試將雜亂無章地應用於您的案例

In [122]: x = np.array([[0, 1, 2, 3],
     ...:        [0, 1, 1, 3],
     ...:        [3, 1, 3, 1]])
     ...:        
In [123]: x3 = np.dstack((x,x,x))
In [125]: dx3 = x3.reshape(36,1)
In [126]: np.savetxt('test3.txt',dx3, fmt='%i')
In [127]: cat test3.txt
0
0
0
....
3
3
1
1
1

在八度

>> file = fopen('test3.txt')
file =  21
>> array = fscanf(file,'%f')
array =
   0
   0
   ....

>> reshape(array,3,4,3)
ans =
ans(:,:,1) =
   0   1   2   3
   0   1   2   3
   0   1   2   3
ans(:,:,2) =
   0   1   1   3
   0   1   1   3
   0   1   1   3
ans(:,:,3) =
   3   1   3   1
   3   1   3   1
   3   1   3   1

和perpertation

>> permute(reshape(array,3,4,3),[3,2,1])
ans =
ans(:,:,1) =
   0   1   2   3
   0   1   1   3
   3   1   3   1
ans(:,:,2) =
   0   1   2   3
   0   1   1   3
   3   1   3   1
ans(:,:,3) =
   0   1   2   3
   0   1   1   3
   3   1   3   1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM