我在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代码真的是正确的吗?如果是的话,我该怎么做?
答案 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,:]
。