鉴于numpy矩阵,我正在寻找创建一个新的矩阵,该矩阵由从起始矩阵的列计算的列组成。我可以用矢量操作来做到这一点,但它并不是很优雅。举个例子,假设我想计算简单的增长率。 p>
起始矩阵:
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]])
我处理的真实矩阵包含许多列。
答案 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。 (旁白:请注意我使用数组而不是矩阵,因为它们通常更方便,但上面的内容也适用于矩阵。)
即使操作不能如此容易地进行矢量化 - 比如列计算之间存在依赖关系 - 只要列数与行数相比较小,您也可以手动循环。循环最小尺寸并将计算矢量化为其余尺寸是一种常见的折衷方案。