Numpy reshape在复制和未复制数组上的行为不同

Nic*_*ger 3 python arrays numpy scipy

当使用numpy.reshape展平某些numpy数组时,我遇到了看似不一致的结果.有时如果我重塑一个数组,它会返回一个包含一行的2D数组,而如果我先复制数组然后执行完全相同的操作,它将返回一维数组.

这似乎主要发生在将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
Run Code Online (Sandbox Code Playgroud)

运行时打印:

x1.shape= (1, 100)
x2.shape= (100,)
Run Code Online (Sandbox Code Playgroud)

numpy.flatten()也会发生同样的事情.这里发生了什么?这种行为是故意的吗?

use*_*ica 5

您将稀疏矩阵对象和普通ndarray一起添加:

X = I+A
Run Code Online (Sandbox Code Playgroud)

结果是一个密集的矩阵对象,一个实例np.matrix,而不是一个普通的ndarray.

这个:

np.reshape(X, -1)
Run Code Online (Sandbox Code Playgroud)

最终返回一个不能小于2D的矩阵.

这个:

np.reshape(np.copy(X), -1)
Run Code Online (Sandbox Code Playgroud)

使得正常的ndarray np.copy(X),所以你得到一个1D输出np.reshape.

在任何时候都要非常小心,无论是处理稀疏矩阵,密集矩阵还是标准ndarray.np.matrix尽可能避免.