将Numpy矩阵转为数组

197

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

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

为了实现这一点,我使用A = np.array(M.T)[0]。 有没有人知道更简洁优雅的方法来获得相同的结果?

谢谢!


逆向问题:将2D numpy数组转换为2D numpy矩阵 - Tobias Kienzler
10个回答

240

如果你想让内容更易读,可以这样做:

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

等价地,你也可以这样做:A = np.asarray(M).reshape(-1),但这种方式不太易读。


17
个人感想:我为什么numpy要将数组和矩阵作为不同的实体。在我看来这太不符合Python的风格了。感谢@Joe的提示。 - Naijaba
9
不论价值如何,矩阵类实际上(但不是正式地)已经被淘汰了。它主要出于历史目的而存在。删除numpy.matrix是一个有争议的问题,但是Numpy开发人员非常赞同您的观点,即拥有两者对于Python来说是不符合惯例且令人讨厌的。然而,“野外”中使用matrix的大量旧且未维护的代码使得完全删除它变得困难。 - Joe Kington
1
更不用说,真正的矩阵乘法只在Numpy 1.10中为数组添加,并且基本上仍处于测试阶段。这意味着很多人(包括我自己)仍然必须使用矩阵而不是数组来完成我们想要完成的任务。https://docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html - Georges Oates Larsen
2
稀疏矩阵对于内存高效的机器学习(例如 sklearn)至关重要。实际上,在 scipy 中有不同的 sparse matrix 类型,可以通过行或列进行高效访问。我想这可能是将矩阵和数组的概念合并的一个问题。话虽如此,我想知道是否也可以引入 sparse array 类型,并且是否有任何计划来实现它。有什么线索吗? - pms
我认为 .flatten() 和 .squeeze() 一样有效,只要最终需要一个一维数组即可。 - wordsforthewise
array(..)默认情况下copy = True,因此如果您想要A和M不同,则它们是不同的[[“asarray”对矩阵子类的行为相同]] 请参见@hpaulj M.A1与np.ravel(M)相同,它返回M在A中的视图,共享内存-更适用于大型矩阵。 - jayprich

150

8
我认为这个答案在性能和简洁性方面比被采纳的答案更好。 - dariush
M.A1很棒,与“ravel”和“flatten”具有相同的实现,在这种情况下不会导致任何数据复制,因此A仍然链接到M,如果A和/或M是可变的,则可能会引起意外。 M.flat是真正的替代品,返回“flatiter”生成器(只读语义) np.squeeze(M)#提供删除大小为1的维度的视图,在这里也可以,但不能保证对于一般M是1-d np.reshape(M,-1)#通常是视图,具体取决于形状兼容性,“-1”是执行A1 / ravel / flatten的迂回方式 - jayprich

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

取决于你所说的“优雅”是什么意思,但那就是我会做的事情。


13

你可以尝试以下变体:

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

9
np.array(M).ravel()

如果您关心速度;但如果您关心内存:
np.asarray(M).ravel()

2
如果您解释一下为什么,那将会提高您回答的质量。 - Milo Wielondek

7

或者您可以尝试使用以下方法避免一些临时问题:

A = M.view(np.ndarray)
A.shape = -1

2
首先,Mv = numpy.asarray(M.T)将给你一个4x1但是2D数组。
然后,执行A = Mv[0,:],这会给你所需的结果。你可以将它们组合在一起,如numpy.asarray(M.T)[0,:]

2
这将把矩阵转换成数组。
A = np.ravel(M).T

2
"ravel()"和"flatten()"是来自numpy的两种技术,我想在这里尝试一下。我想补充一下JoeSirajbubbleKevad发表的帖子。 Ravel:"
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()`更快,因为它是一个库级别的函数,不会复制数组。但是,如果您使用`numpy.ravel()`,则对数组A进行的任何更改都会传递到原始数组M。
`numpy.flatten()`比`numpy.ravel()`慢。但是,如果您使用`numpy.flatten()`来创建A,则对A的更改不会传递到原始数组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

-1

有点晚了,希望这能帮到某个人,

np.array(M.flat)

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