[英]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索引不同。 為了研究這個問題,讓我們創建一個數字1
到8
的線性數組,然后將結果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
我認為python使用這種類型的索引來創建數組,如下圖所示:
並且,有很多方法可以存儲您的數據,您可以選擇order ='F'來首先按照matlab計算列,而默認值是order ='C',它首先計算行數....
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.