我有一个maxtrix数据,形状是10201 * 101,只包含0和1.下面的代码是matlab / python相同的peocession,但它得到的结果不同,我不知道为什么......
BOUND = load('C:\Users\1\Desktop\ct06\result_data116.dat');
BOUND = reshape(BOUND,101,101,101);
BOUND(:,:,[1,101]) = 1;
BOUND(:,[1,101],:) = 1;
Boundary = find(BOUND>0); #matlab > Boubdary : 808243x1 double
import numpy as np
BOUND = np.loadtxt(r'C:\Users\1\Desktop\ct06\result_data116.dat').reshape([101,101,101])
BOUND[:,:,[0,100]] = 1
BOUND[:,[0,100],:] = 1
Boundary = np.where(BOUND>0)
print(Boundary[0].size) #python > 809074
我真的不知道为什么它有两个不同的边界(808243和809074)?
我猜分配操作是导致差异的原因(我推迟了分配部分,然后他们得到了相同的结果)。但我仍然不知道为什么......
答案 0 :(得分:1)
Matlab使用列主要排序,而python使用行主要(读取https://en.wikipedia.org/wiki/Row-_and_column-major_order以获取有关此含义的更多详细信息)。例如,在python中
t = np.eye(3)
t[0,1] = 3
np.reshape(t, (9, 1))
结果
array([[ 1.],
[ 3.],
[ 0.],
[ 0.],
[ 1.],
[ 0.],
[ 0.],
[ 0.],
[ 1.]])
在matlab中使用相同的命令
t = eye(3)
t(1,2) = 3
reshape(t, 9, 1)
结果
ans =
1
0
0
3
1
0
0
0
1
仅仅因为命令在两种不同的编程语言中具有相同的名称并不意味着它们会做同样的事情。仅仅因为两个命令声称做同样的事情并不意味着结果不会有微妙的不同。在将所有数据文件放在其中之前,始终使用简单的输入测试代码。
答案 1 :(得分:0)
可能的原因是Matlab使用列主要顺序,所以当你做
时BOUND[:,[0,100],:] = 1
Matlab和Python的行为不同。