Matlab与Python中find/where、reshape、eig的区别
find/where、reshape的区别
Matlab中,矩阵的单下标是列元素优先的,所以find、reshape得到的结果都是列元素优先的排序方式。
而Python中,通过numpy使用矩阵,其单下标是行元素优先的,所以,reshape得到的结果都是按行元素优先排列的;不过,可以通过设置参数order=’F’,使其排序和matlab中的一样,当where和reshape配合使用的来过滤数据的时候,要保证数据排序的一致。
numpy.where返回的结果是全下标方式,而不是单下标,和find不同,如果要实现和find一样的单下标,可将矩阵flatten成一维数据,再使用where获得全下标,取其中的单个下标来使用即可。如下:
#获取mask要保留的数据下标 ids = np.where(self.mask.flatten() > 0)[1]; # 将一个波段的图像数据转为一列数据,共bands列 X = np.reshape(self.X, (self.nrows*self.ncols, self.nvar1)) Y = np.reshape(self.Y, (self.nrows*self.ncols, self.nvar2)) # 每个波段只保留要的值,保留相应的行 XMask = X[ids, :] YMask = Y[ids, :]
这里,flatten和reshape都使用了默认的行元素优先的顺序,如果要列元素优先,可改为: