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矩阵到数组的主要内容,如果未能解决你的问题,请参考以下文章

numpy矩阵和数组的区别

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

cupy或numpy中"数组"与"矩阵"的区别

将 SymPy 矩阵转换为 numpy 数组/矩阵的最佳方法是啥

swig numpy 多个矩阵和数组输入

numpy:矩阵定义与索引