在使用 numpy.reshape 展平某些 numpy 数组时,我遇到了看似不一致的结果。有时,如果我 reshape 一个数组,它会返回一个只有一行的二维数组,而如果我先复制该数组然后执行完全相同的操作,它会返回一个一维数组。
这似乎主要发生在将 numpy 数组与 scipy 数组组合时,并且当我稍后想将展平数组乘以矩阵时会产生对齐问题。
例如,考虑以下代码:
import numpy as np
import scipy.sparse as sps
n = 10
A = np.random.randn(n,n)
I = sps.eye(n)
X = I+A
x1 = np.reshape(X, -1)
x2 = np.reshape(np.copy(X), -1)
print 'x1.shape=', x1.shape
print 'x2.shape=', x2.shape
运行时打印:
x1.shape= (1, 100)
x2.shape= (100,)
同样的事情发生在 numpy.flatten() 上。这里发生了什么?这种行为是故意的吗?
最佳答案
您将一个稀疏矩阵对象和一个普通的 ndarray 添加在一起:
X = I+A
结果是一个密集的 matrix 对象,它是 np.matrix
的一个实例,而不是一个普通的 ndarray。
这个:
np.reshape(X, -1)
最终返回一个矩阵,它不能小于 2D。
这个:
np.reshape(np.copy(X), -1)
在 np.copy(X)
中创建一个普通的 ndarray,因此您可以从 np.reshape
获得一维输出。
无论您处理的是稀疏矩阵、稠密矩阵还是标准 ndarray,请始终非常小心。尽可能避免 np.matrix
。
关于python - Numpy reshape 对复制数组和未复制数组的作用不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39926628/