Numpy矩阵到数组
Posted
技术标签:
【中文标题】Numpy矩阵到数组【英文标题】:Numpy matrix to array 【发布时间】:2011-03-21 05:17:23 【问题描述】:我正在使用 numpy.我有一个 1 列 N 行的矩阵,我想从 N 个元素中获取一个数组。
例如,如果我有M = matrix([[1], [2], [3], [4]])
,我想获得A = array([1,2,3,4])
。
为了实现它,我使用A = np.array(M.T)[0]
。有谁知道获得相同结果的更优雅的方法?
谢谢!
【问题讨论】:
Ivnerse 问题:convert a 2D numpy array to a 2D numpy matrix 【参考方案1】:如果你想要一些更易读的东西,你可以这样做:
A = np.squeeze(np.asarray(M))
同样地,您也可以这样做:A = np.asarray(M).reshape(-1)
,但这不太容易阅读。
【讨论】:
对我来说有点咆哮......为什么 numpy 将数组和矩阵作为单独的实体。恕我直言,这太不合情理了。感谢@Joe 的提示。 @Naijaba - 就其价值而言,矩阵类已有效(但未正式)折旧。它主要用于历史目的。删除numpy.matrix
是一个有争议的问题,但 numpy 开发人员非常同意你的观点,即两者兼有是不合 Python 的,而且出于各种原因很烦人。然而,大量使用 matrix
的旧的、未维护的“野外”代码使其难以完全删除。
更不用说,真正的矩阵乘法只是在 Numpy 1.10 中为数组添加,并且基本上仍处于测试阶段。这意味着很多人(包括我自己)仍然必须使用矩阵而不是数组来完成我们想做的事情。 docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
稀疏矩阵是内存高效机器学习的基础(例如,sklearn
)。事实上,scipy
中有不同的sparse matrix
类型,它们允许通过行或列进行有效访问。我想这可能是合并矩阵和数组概念的问题。也就是说,我想知道是否也可以引入 sparse array
类型以及是否有任何计划这样做。有什么线索吗?
我认为 .flatten() 和 .squeeze() 一样有效,只要你最终想要一个一维数组。【参考方案2】:
或者你可以试着避免一些临时工
A = M.view(np.ndarray)
A.shape = -1
【讨论】:
【参考方案3】:A, = np.array(M.T)
这取决于我想你所说的优雅是什么意思,但这就是我会做的
【讨论】:
【参考方案4】:您可以尝试以下变体:
result=np.array(M).flatten()
【讨论】:
【参考方案5】:result = M.A1
https://numpy.org/doc/stable/reference/generated/numpy.matrix.A1.html
matrix.A1
1-d base array
【讨论】:
我认为这个答案比公认的答案,性能方面和简单性要好 M.A1 很棒,与“ravel”和“flatten”的实现相同,在这种情况下不会导致任何数据副本 A 因此仍然链接到 M 如果 A 和/或可能会导致意外M 是可变的。 M.flat 真正的替代返回“flatiter”生成器(只读语义) np.squeeze(M) # 给出一个删除尺寸为 1 的视图,这里也可以,但不保证对于一般 M np.reshape( M,-1) # 通常是一个取决于形状兼容性的视图,这个“-1”是做A1/ravel/flatten的迂回方式【参考方案6】:np.array(M).ravel()
如果您关心速度;但如果你关心记忆:
np.asarray(M).ravel()
【讨论】:
如果你解释了原因会提高你的回答质量【参考方案7】:首先,Mv = numpy.asarray(M.T)
,它为您提供了一个 4x1 的二维数组。
然后,执行A = Mv[0,:]
,它会给你你想要的。你可以把它们放在一起,就像numpy.asarray(M.T)[0,:]
。
【讨论】:
【参考方案8】:这会将矩阵转换为数组
A = np.ravel(M).T
【讨论】:
【参考方案9】:ravel() 和 flatten() 来自 numpy 的函数是我会在这里尝试的两种技术。我想补充Joe、Siraj、bubble 和Kevad 的帖子。
拉威尔:
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
【讨论】:
【参考方案10】:来晚了,希望对大家有所帮助,
np.array(M.flat)
【讨论】:
以上是关于Numpy矩阵到数组的主要内容,如果未能解决你的问题,请参考以下文章
从 scipy CSR 矩阵索引到 numpy 数组的最有效方法?