以下八度音程代码使用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)
的相同索引不匹配八度/ Matlab的
八度:6个A(1,3,2)
ans = 33
的Python
>>>阵列[0,2,1]
8
答案 0 :(得分:5)
你的数组在numpy中的构造方式与在MATLAB中的不同。
你的MATLAB数组是(y, x, z)
,你的numpy数组是(z, y, x)
。你的3d numpy阵列是一系列堆积的' 2d阵列,因此您可以在"外部>内部" (因为没有更好的术语)。这里扩展了你的数组定义,所以这(希望)更有意义:
[[[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中那样生成它。
答案 1 :(得分:2)
我认为问题是你在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
答案 2 :(得分:2)
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
的Python:
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在评论中建议的那样首先正确地创建矩阵。
答案 3 :(得分:1)
我认为python使用这种类型的索引来创建数组,如下图所示:
并且,有很多方法可以存储您的数据,您可以选择订单=' F'首先按照matlab计算列数,而默认值是order =' C'首先计算行....
答案 4 :(得分:0)