MATLAB上的索引矩阵行和列,这段代码好吗?

时间:2017-07-19 19:00:50

标签: python arrays matlab numpy matrix

我在MATLAB上有一些代码,我必须将它转换为Python才能使用它。通过代码我找到了这一行:

filtered_proj (new_len, :, 1) = 0;

所以在阅读MATLAB Documentation后,我理解并尝试应用我的Python代码。我使用NumPy在Python中创建了一个矩阵来测试:

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

但是当我尝试访问它时,它是用MATLAB编写的,带有以下python代码

a[1,:,1]

我收到此消息:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
IndexError: too many indices for array

如果我像a[1: ,1]那样访问,我会得到这个:

array([4, 6])

a[1,: 1]一样,我得到了这个:

array([3])

那么,这个MATLAB代码真的是正确的吗?如果是的话,我该怎么做?

3 个答案:

答案 0 :(得分:2)

MATLAB索引表明您有一个3D阵列。你的numpy数组是一个3行,2列的2D矩阵。您需要为测试创建一个3D数组才能工作。另外,请记住,numpy指数从零开始,而MATLAB指数从1开始。

索引a[1:, 1]获取每列的第二个元素,以第二个开头的所有行。所以[4, 6]正是预期的结果。

同样,a[1, :1]获取第二行(但不包括)第二列。由于该行有两个元素,因此它正确返回[3]

要使a[1, :, 1]a[0, :, 0]等3D索引生效,请将测试数组初始化为3D数组:

a = np.array([[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]])

或更好:

a = np.arange(1, 13).reshape(2, 3, 2)

现在a[0, :, 0]提供[1, 3, 5]a[1, :, 1]提供[8, 10, 12],正如所料。

答案 1 :(得分:2)

如果您的MATLAB代码没有更多上下文,我无法评论MATLAB代码是否正确。

但是 myMatrix = numpy.array([[1, 2], [3, 4], [5, 6]]) 创建一个3 x 2矩阵,其中有3行长度为2.这三行是[1,2],[3,4],[5,6],如输入中所指定。围绕所有这些的外部括号告诉你正在创建一个矩阵。

语法a[1,:,1]失败,因为您创建的数组中只有2个维度,而不是3个维度。这些维度是:行“维度”和列“维度”。

答案 2 :(得分:2)

首先,检查Matlab工作区中filtered_proj变量的维度(即运行ndims(filtered_proj))。如果它是3d,则其他答案适用,但如果它是2d矩阵,我会给你答案。

给定一个带维度的变量 n ,Matlab可灵活地使用 n 维度进行索引提供附加索引为1。 / p>

例如,

X = 5;
display(X(1,1,1,1,1));

将显示5

但是

X = 5;
display(X(1,1,1,1,5));

将抛出错误&#34;索引超出矩阵维度。&#34;

在你的numpy代码中,你声明了一个2d矩阵。在Matlab中,您可以使用a(1,:,1)索引到2d矩阵,因为最终索引是1.但是,Numpy更严格并抛出错误。

因此,当您将代码从Matlab转换为numpy时,必须从命令中删除其他维度,即a[1,:]