最优雅的是在numpy矩阵中计算很多列?

时间:2015-08-08 01:49:36

标签: python numpy matrix

鉴于numpy矩阵,我正在寻找创建一个新的矩阵,该矩阵由从起始矩阵的列计算的列组成。我可以用矢量操作来做到这一点,但它并不是很优雅。举个例子,假设我想计算简单的增长率。

起始矩阵:

m = np.matrix(np.random.random_integers(1,100, size=(5,3)))
matrix([[ 96,  61, 100],
       [ 18,  82,  17],
       [ 59,  35,  58],
       [ 26,  97,  95],
       [ 25,  49,  32]])

期望的计算矩阵g:

g0 = np.empty((5, 1))
g0[:] = np.nan
g1 = (m[:, 1] - m[:, 0]) / m[:, 0]
g2 = (m[:, 2] - m[:, 1]) / m[:, 1]
g = np.hstack((g0, g1, g2))
matrix([[        nan, -0.36458333,  0.63934426],
        [        nan,  3.55555556, -0.79268293],
        [        nan, -0.40677966,  0.65714286],
        [        nan,  2.73076923, -0.02061856],
        [        nan,  0.96      , -0.34693878]])

我处理的真实矩阵包含许多列。

1 个答案:

答案 0 :(得分:1)

对于这个特殊问题,您可以一步完成计算:

>>> (m[:,1:]- m[:,:-1])/m[:,:-1]
array([[-0.36458333,  0.63934426],
       [ 3.55555556, -0.79268293],
       [-0.40677966,  0.65714286],
       [ 2.73076923, -0.02061856],
       [ 0.96      , -0.34693878]])

>>> np.diff(m,1) / m[:,:-1]
array([[-0.36458333,  0.63934426],
       [ 3.55555556, -0.79268293],
       [-0.40677966,  0.65714286],
       [ 2.73076923, -0.02061856],
       [ 0.96      , -0.34693878]])

如果你坚持的话,你可以添加一列nans。 (旁白:请注意我使用数组而不是矩阵,因为它们通常更方便,但上面的内容也适用于矩阵。)

即使操作不能如此容易地进行矢量化 - 比如列计算之间存在依赖关系 - 只要列数与行数相比较小,您也可以手动循环。循环最小尺寸并将计算矢量化为其余尺寸是一种常见的折衷方案。