如何从 numpy 矩阵传递到 numpy 数组?

Posted

技术标签:

【中文标题】如何从 numpy 矩阵传递到 numpy 数组?【英文标题】:how to pass from numpy matrix to numpy array? 【发布时间】:2013-11-26 06:35:39 【问题描述】:

我是 Python 和 Numpy 的新手,所以我的问题的标题可能是错误的。

我从 matlab 文件中加载一些数据

data=scipy.io.loadmat("data.mat")
x=data['x']
y=data['y']
>>> x.shape
(2194, 12276)
>>> y.shape
(2194, 1)

y 是一个向量,我想要y.shape = (2194,)

我不知道(2194,)(2194,1) 之间的区别,但如果您尝试加载y 使得y.shape=(2194,1) ,sklearn.linear_model.LassoCV 似乎会遇到错误。

那么如何更改我的y 向量以获得y.shape=(2194,)??

【问题讨论】:

【参考方案1】:

先转换成数组,再挤压去掉多余的维度:

y = y.A.squeeze()

分步:

In [217]: y = np.matrix([1,2,3]).T

In [218]: y
Out[218]: 
matrix([[1],
        [2],
        [3]])

In [219]: y.shape
Out[219]: (3, 1)

In [220]: y = y.A

In [221]: y
Out[221]: 
array([[1],
       [2],
       [3]])

In [222]: y.shape
Out[222]: (3, 1)

In [223]: y.squeeze()
Out[223]: array([1, 2, 3])

In [224]: y = y.squeeze()

In [225]: y.shape
Out[225]: (3,)

【讨论】:

我喜欢y.A 语法(我相信它是y.__array__() 的别名)来获得比np.asarray 更好的底层数组。 好的,谢谢!但是你能稍微解释一下大小为 (2194,) 和 (2194,1) 的元素之间的区别吗? 数据相同,但shape不同;维数也是如此 (ndim)。进入 Python shell,导入 numpy,然后玩弄一个小数组。查看形状和 ndim,转置、挤压、转换为矩阵并返回。添加维度。在 matlab 中,数组至少有 2 个维度。 numpy 矩阵是在不能有更多维度的旧 matlab 数组上建模的。 @Donbeo,正如@hpaulj 所说,它们是相同的数据,只是视图不同。随着您对 numpy 越来越熟悉,view vs a copy 的概念将变得很重要。某些动作会给出一个视图,例如,reshape 和切片(a[:10] 是前十项的视图),np.asarray 尽可能不复制数据。其他人制作副本,例如,np.array 和 'fancy indexing' a[a>5] 都返回副本。

以上是关于如何从 numpy 矩阵传递到 numpy 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 numpy.matrix 或数组转换为 scipy 稀疏矩阵

尝试将自定义 C++ 矩阵传递给 numpy 数组

从 scipy CSR 矩阵索引到 numpy 数组的最有效方法?

NumPy 2d 数组的切片,或者如何从 nxn 数组 (n>m) 中提取 mxm 子矩阵?

TypeError:传递了稀疏矩阵,但需要密集数据。使用 X.toarray() 转换为密集的 numpy 数组。使用 NaiveBayes 分类器

从 numpy 数组创建稀疏矩阵