以下 Octave 代码显示了使用 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 和 Python numpy 中矩阵实现之间的区别 Numpy for Matlab users但我没有找到示例 3d 数组并将其映射到 Matlab 中,反之亦然!
答案是不同的,例如在 Matlab 中访问元素 (1,3,2) 与使用 numpy (0,2,1) 的相同索引不匹配
Octave /Matlab
Octave :6> A(1,3,2)
ans = 33
python
>>>数组[0,2,1]
8
最佳答案
在 numpy 中构造数组的方式与在 MATLAB 中不同。
您的 MATLAB 数组是 (y, x, z)
,您的 numpy 数组是 (z, y, x)
。您的 3d numpy 数组是一系列“堆叠”二维数组,因此您正在索引“外部->内部”(因为缺少更好的术语)。这是扩展的数组定义,因此(希望如此)更有意义:
[[[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 中那样生成它。
关于python - Numpy 数组和 Matlab 矩阵不匹配 [3D],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38789455/