【发布时间】: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]。有谁知道获得相同结果的更优雅的方法?
谢谢!
【问题讨论】:
标签: python arrays matrix numpy
我正在使用 numpy.我有一个 1 列 N 行的矩阵,我想从 N 个元素中获取一个数组。
例如,如果我有M = matrix([[1], [2], [3], [4]]),我想获得A = array([1,2,3,4])。
为了实现它,我使用A = np.array(M.T)[0]。有谁知道获得相同结果的更优雅的方法?
谢谢!
【问题讨论】:
标签: python arrays matrix numpy
如果你想要一些更易读的东西,你可以这样做:
A = np.squeeze(np.asarray(M))
同样地,您也可以这样做:A = np.asarray(M).reshape(-1),但这不太容易阅读。
【讨论】:
numpy.matrix 是一个有争议的问题,但 numpy 开发人员非常同意你的观点,即两者兼有是不合 Python 的,而且出于各种原因很烦人。然而,大量使用 matrix 的旧的、未维护的“野外”代码使其难以完全删除。
sklearn)。事实上,scipy 中有不同的sparse matrix 类型,它们允许通过行或列进行有效访问。我想这可能是合并矩阵和数组概念的问题。也就是说,我想知道是否也可以引入 sparse array 类型以及是否有任何计划这样做。有什么线索吗?
或者你可以试着避免一些临时工
A = M.view(np.ndarray)
A.shape = -1
【讨论】:
A, = np.array(M.T)
这取决于我想你所说的优雅是什么意思,但这就是我会做的
【讨论】:
您可以尝试以下变体:
result=np.array(M).flatten()
【讨论】:
result = M.A1
https://numpy.org/doc/stable/reference/generated/numpy.matrix.A1.html
matrix.A1
1-d base array
【讨论】:
np.array(M).ravel()
如果您关心速度;但如果你关心记忆:
np.asarray(M).ravel()
【讨论】:
首先,Mv = numpy.asarray(M.T),它为您提供了一个 4x1 的二维数组。
然后,执行A = Mv[0,:],它会给你你想要的。你可以把它们放在一起,就像numpy.asarray(M.T)[0,:]。
【讨论】:
这会将矩阵转换为数组
A = np.ravel(M).T
【讨论】:
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
【讨论】:
来晚了,希望对大家有所帮助,
np.array(M.flat)
【讨论】: