簡體   English   中英

Numpy數組和Matlab矩陣不匹配[3D]

[英]Numpy array and Matlab Matrix are mismatching [3D]

以下八度音程代碼使用Octave / Matlab顯示示例3D矩陣

octave:1> A=zeros(3,3,3);
octave:2> 
octave:2> A(:,:,1)= [[1 2 3];[4 5 6];[7 8 9]];
octave:3> 
octave:3> A(:,:,2)= [[11 22 33];[44 55 66];[77 88 99]];
octave:4> 
octave:4> A(:,:,3)= [[111 222 333];[444 555 666];[777 888 999]];
octave:5> 
octave:5> 
octave:5> A
A =

ans(:,:,1) =

   1   2   3
   4   5   6
   7   8   9

ans(:,:,2) =

   11   22   33
   44   55   66
   77   88   99

ans(:,:,3) =

   111   222   333
   444   555   666
   777   888   999

octave:6> A(1,3,2)
ans =  33

我需要使用numpy轉換相同的矩陣...不幸的是當我嘗試使用numpy中的數組訪問相同的索引時,我得到不同的值,如下所示!

import numpy as np
array = np.array([[[1 ,2 ,3],[4 ,5 ,6],[7 ,8 ,9]], [[11 ,22 ,33],[44 ,55 ,66],[77 ,88 ,99]], [[111 ,222 ,333],[444 ,555 ,666],[777 ,888 ,999]]])
>>> array[0,2,1]
8

我還閱讀了以下文檔,該文檔顯示了Matlab中的矩陣實現與Matlab用戶的 Python numpy Numpy之間的區別,但我沒有找到示例3d數組並將其映射到Matlab,反之亦然!

答案是不同的,例如在Matlab中訪問元素(1,3,2)與使用numpy(0,2,1)的相同索引不匹配

八度/ Matlab的

八度:6> A(1,3,2)

ans = 33

蟒蛇

>>>數組[0,2,1]

8

你的數組在numpy中構造的方式與在MATLAB中的不同。

你的MATLAB數組是(y, x, z) ,你的numpy數組是(z, y, x) 你的3d numpy數組是一系列“堆疊”的2d數組,所以你要將“outside-> inside”編入索引(因為沒有更好的術語)。 這是你的數組定義擴展,所以這(希望)更有意義:

[[[1, 2, 3],
  [4, 5, 6],        # Z = 0
  [7 ,8 ,9]],
 [[11 ,22 ,33],
  [44 ,55 ,66],     # Z = 1
  [77 ,88 ,99]],
 [[111 ,222 ,333],
  [444 ,555 ,666],  # Z = 2
  [777 ,888 ,999]]
]

所以:

import numpy as np

A = np.array([[[1 ,2 ,3],[4 ,5 ,6],[7 ,8 ,9]], [[11 ,22 ,33],[44 ,55 ,66],[77 ,88 ,99]], [[111 ,222 ,333],[444 ,555 ,666],[777 ,888 ,999]]])
B = A[1, 0, 2]

B按預期返回33

如果您想要一種不那么令人費解的方法來索引數組,請考慮像在MATLAB中那樣生成它。

MATLAB和Python索引不同。 為了研究這個問題,讓我們創建一個數字18的線性數組,然后將結果reshape整形為每種語言的2 by- 2 by- 2矩陣:

MATLAB:

M_flat = 1:8
M = reshape(M_flat, [2,2,2])

返回

M =

ans(:,:,1) =

   1   3
   2   4

ans(:,:,2) =

   5   7
   6   8

蟒蛇:

import numpy as np
P_flat = np.array(range(1,9))
P = np.reshape(P, [2,2,2])

返回

array([[[1, 2],
        [3, 4]],

       [[5, 6],
        [7, 8]]])

您應該注意的第一件事是前兩個維度已經切換。 這是因為MATLAB使用列主索引,這意味着我們首先倒數列,而Python使用行主索引,因此它首先計算行數。

現在讓我們嘗試索引它們。 所以讓我們嘗試沿着不同的維度切片。 在MATLAB中,我知道可以從第三維中獲得切片

M(:,:,1)

ans =

   1   3
   2   4

現在讓我們在Python中嘗試相同的操作

P[:,:,0]

array([[1, 3],
       [5, 7]])

所以這完全不同。 要獲得MATLAB“等效”,我們需要去

P[0,:,:]

array([[1, 2],
       [3, 4]])

現在,這將返回MATLAB版本的轉置,這是由於行主要與列主要差異所預期的。

那么這對於索引是什么意思呢? 看起來Python將主要索引放在最后,這與MALTAB 相反

假設我在MATLAB中索引如下

M(1,2,2)

ans = 

    7

現在要從Python中獲取7 ,我們應該去

P(1,1,0)

這是MATLAB語法顛倒過來的。 請注意,這是相反的,因為我們創建了Python矩陣,並考慮了行主要排序。 如果你像在代碼中那樣創建它,則必須交換最后2個索引,而不是像Ander在評論中建議的那樣首先正確地創建矩陣。

我認為問題是你在numpy中創建矩陣的方式以及matlab和numpy的不同表示,為什么你不在matlab和numpy中使用相同的系統

>>> A = np.zeros((3,3,3),dtype=int)
>>> A
array([[[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]],

       [[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]]])
>>> A[:,:,0] = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> A[:,:,1] = np.array([[11,22,33],[44,55,66],[77,88,99]])
>>> A[:,:,2] = np.array([[111,222,333],[444,555,666],[777,888,999]])
>>> A
array([[[  1,  11, 111],
        [  2,  22, 222],
        [  3,  33, 333]],

       [[  4,  44, 444],
        [  5,  55, 555],
        [  6,  66, 666]],

       [[  7,  77, 777],
        [  8,  88, 888],
        [  9,  99, 999]]])
>>> A[0,2,1]
33

我認為不僅僅是調用差異“行主要”或“列專業”是numpy描述它們的方式:

“C”表示使用類似C的索引順序讀取/寫入元素,最后一個軸索引變化最快,返回到第一個軸索引變化最慢。 'F'表示使用類似Fortran的索引順序讀/寫元素,第一個索引變化最快,最后一個索引變化最慢。

一些GIF來說明差異:第一個是行主要(python / c),第二個是列主要(MATLAB / Fortran)

Python / C索引排序

MATLAB / Fortran索引排序

我認為python使用這種類型的索引來創建數組,如下圖所示:

https://www.google.com.eg/search?q=python+indexing+arrays+numpy&biw=1555&bih=805&source=lnms&tbm=isch&sa=X&ved=0ahUKEwia7b2J1qzOAhUFPBQKHXtdCBkQ_AUIBygC#imgrc=7JQu1w_4TCaAnM%3A

並且,有很多方法可以存儲您的數據,您可以選擇order ='F'來首先按照matlab計算列,而默認值是order ='C',它首先計算行數....

暫無
暫無

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

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