python - Numpy reshape 对复制数组和未复制数组的作用不同

标签 python arrays numpy scipy

在使用 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/

相关文章:

python - numpy.fft.fft() 在 Python 中的实现

python - 替换 Python 中的深度循环

python - Python 中的 groupby 会生成列或数据框吗?

python - 无法使用 Python 产生正确的值

javascript - 用数组动态填充多维数组

arrays - 最快查找已知静态整数集?

javascript - 在 jQuery 中使用一个关联数组代替两个索引数组

python - 如何在给定语法规则的情况下生成所有可能的字符串?

python - 在python中生成多个独立的随机流

python - 如何通过原始输入从类中提取信息