块矩阵到数组


149

我正在使用numpy。我有一个具有1列和N行的矩阵,并且我想从中获得具有N个元素的数组。

例如,如果我有M = matrix([[1], [2], [3], [4]]),我想得到A = array([1,2,3,4])

为此,我使用A = np.array(M.T)[0]。有谁知道一种更优雅的方式来获得相同的结果?

谢谢!


Answers:


192

如果您想让内容更具可读性,可以执行以下操作:

A = np.squeeze(np.asarray(M))

同样,您也可以执行以下操作:A = np.asarray(M).reshape(-1),但是它不太容易阅读。


9
我有点不高兴...为什么numpy会将数组和矩阵作为单独的实体。真是不可思议的恕我直言。感谢这篇技巧@Joe。
内贾巴

6
@Naijaba-就其价值而言,矩阵类实际上(但不是正式地)贬值了。它在那里主要是出于历史目的。删除numpy.matrix是一个有争议的问题,但是Numpy开发人员非常同意您的观点,因为很多原因,两者都令人讨厌。但是,由于使用了大量旧的,未经维护的代码,matrix因此很难完全删除它。
Joe Kington

1
更不用说,仅在Numpy 1.10中为数组添加了真正的矩阵乘法,并且基本上仍处于beta状态。这意味着很多人(包括我自己)仍然必须使用矩阵而不是数组来完成我们想要完成的工作。docs.scipy.org/doc/numpy/reference/generation/numpy.matmul.html
Georges Oates Larsen

1
稀疏矩阵是内存有效的机器学习(例如sklearn)的基础。实际上,中有不同的sparse matrix类型scipy,它们允许通过行或列进行有效访问。我想这可能是合并矩阵和数组概念的问题。就是说,我想知道是否也可以引入一种sparse array类型,以及是否有任何计划这样做。有什么线索吗?
PMS

我认为.flatten()和.squeeze()一样好,只要您最后想要一维数组即可。
wordforthewise

122

6
我认为这个答案比公认的答案要好,在性能方面和简单性方面都更好
dariush

M.A1很棒,与“ ravel”和“ flatten”相同的实现,在这种情况下不会导致任何数据副本A保持链接到M,如果A和/或M是可变的,则可能会引起意外。M.flat真正的替代返回“ flatiter”生成器(只读语义)np.squeeze(M)#给出了删除大小为1的尺寸的视图,在这里也可以,但对于一般的M np.reshape,也不能保证为1-d( M,-1)#通常是取决于形状兼容性的视图,此“ -1”是回旋的方式,用于进行A1 /
拉威尔

13
A, = np.array(M.T)

我想,这取决于您所说的优雅的意思,但这就是我会做的


11

您可以尝试以下变体:

result=np.array(M).flatten()

7
np.array(M).ravel()

如果您在乎速度;但是,如果您关心内存:

np.asarray(M).ravel()

如果您解释原因,将会提高答案的质量
Milo Wielondek '19


2

第一, Mv = numpy.asarray(M.T)您会得到一个4x1但2D的数组。

然后,执行A = Mv[0,:],这将为您提供所需的内容。您可以将它们放在一起,如numpy.asarray(M.T)[0,:]



0

numpy的ravel()flatten()函数是我将在此处尝试的两种技术。我想补充一下JoeSirajbubbleKevad的帖子

拉威尔:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

展平:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()更快,因为它是库级别的函数,不会复制任何数组。但是,如果使用,则数组A中的任何更改都会将其自身带到原始数组M中numpy.ravel()

numpy.flatten()比慢numpy.ravel()。但是,如果你使用的是numpy.flatten()创建一个,然后改变了一个将不会延续到原来的列M

numpy.squeeze()并且M.reshape(-1)numpy.flatten()和慢numpy.ravel()

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.