如何在python中以某种方式调整矩阵的大小?

时间:2017-05-09 17:27:31

标签: python math matrix scipy interpolation

在实施神经网络之前,我需要预处理一些数据。但我在数学方面是一个菜鸟,我无法在Python中找到一个能够做我想要的功能。

我有这样的矩阵:

[[0 4 ... 0 ]
 [0 3 ... 6 ]
 [0 3 ... 10]]

我有一个数字,例如7,它确定转换后我的新矩阵中必须有多少行。我想要实现的是:

[[0 4    ...  0   ]
 [0 3.66 ...  2   ]
 [0 3.33 ...  4   ]
 [0 3    ...  6   ]
 [0 3    ...  7.33]
 [0 3    ...  8.66]
 [0 3    ...  10  ]]

您看到第一列没有变化,因为对于原始矩阵中的每一行,第一列为零。 对于第二列,第一行在第四行从4到3缓慢减小并且在稳定之后。 最后,最后一列从0增加到10,经过6。

一位数学学生告诉我这是一个插值,但我无法在scipy的文档中找到如何正确地做到这一点。

你知道我该怎么做吗?

1 个答案:

答案 0 :(得分:2)

您可以使用numpy.interp。由于它仅适用于1D,我使用了for循环。

import numpy as np

# You input matrix:
a = np.array([[0, 4, 0], [0, 3, 6], [0, 3, 10]])
# Put the shape you need here:
old_dim, new_dim = a.shape[1], 7
# Define new matrix
b = np.zeros((7, a.shape[1]))
# Define linspace that will serve for interpolation
nls, ols = np.linspace(0, 1, new_dim), np.linspace(0, 1, old_dim)
# Interpolate on each column
for col in range(old_dim):
    b[:,col] = np.interp(nls, ols, a[:,col])
print b

输出:

[[  0.           4.           0.        ]
 [  0.           3.66666667   2.        ]
 [  0.           3.33333333   4.        ]
 [  0.           3.           6.        ]
 [  0.           3.           7.33333333]
 [  0.           3.           8.66666667]
 [  0.           3.          10.        ]]

它不是2D插值函数,但我对scipy不太熟悉(并且numpy没有任何)。

修改 修复非方阵

的问题
import numpy as np

a = np.array([[0, 4, 0], [0, 3, 6], [0, 3, 10]])
old_dim, n_col, new_dim = a.shape[0], a.shape[1], 7
b = np.zeros((7, n_col))
nls, ols = np.linspace(0, 1, new_dim), np.linspace(0, 1, old_dim)
for col in range(n_col):
    b[:,col] = np.interp(nls, ols, a[:,col])
print b

我的错误,我在某个时候颠倒了n_col和n_rows。