如何将numpy矩阵转换为numpy数组?

7

我刚接触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个回答

8

首先将其转换为数组,然后通过挤压操作删除多余的维度:

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,)

2
我喜欢使用 y.A 语法(我相信这是 y.__array__() 的别名)来获取底层数组,比使用 np.asarray 更好。 - Jaime
好的,它可以工作,谢谢!但是你能否添加一些关于大小为(2194,)和(2194,1)的元素之间差异的解释? - Donbeo
1
数据相同,但 shape 不同;维度数量 (ndim) 也不同。进入 Python shell,导入 numpy,并玩转一个小数组。查看其 shape 和 ndim,对其进行转置、压缩、转换为矩阵并再次转换回来。添加维度。在 matlab 中,数组至少有 2 个维度。numpy 矩阵是基于旧版 matlab 数组建模的,这些数组不能拥有更多的维度。 - hpaulj
@Donbeo,正如@hpaulj所说,它们是相同的数据,只是不同的视图。随着您对numpy的熟悉程度越来越高,视图副本的概念将变得重要。某些操作仅提供视图,例如,reshape和切片(a[:10]是前十个项目的视图),而np.asarray如果可能的话就不会复制数据。另一些操作则会进行复制,例如,np.array和'fancy indexing' a[a>5]都返回副本。 - askewchan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接