我有一个.cpp代码,如下所示我将matrix_1的某些值复制到matrix_2。
(注意:最初,matrix_2是matrix_1的副本。)
num_of_row_of_matrix_1 = 400
num_of_col_of_matrix_1 = 700
for (int Row = 0; Row < num_of_row_of_matrix_1; Row += 2)
{
for (int Col = 0; Col < num_of_col_of_matrix_1; Col += 2)
{
matrix_2[Row + 1][Col] = matrix_1[Row][Col + 1];
}
}
现在我在python-2.7中实现了相同的代码,如下所示,
for Row in range(len(matrix_1)/2):
Row *= 2
for Col in range(len(matrix_1[0])/2):
Col *= 2
matrix_2[Row + 1, Col] = matrix_1[Row, Col + 1]
python中的矩阵就像
array([[1, 2, 3, ..., 33, 37, 36],
[4, 5, 6, ..., 25, 16, 26],
[2, 4, 7, ..., 37, 32, 36],
...,
[ 35, 106, 36, ..., 151, 37, 141],
[114, 179, 119, ..., 2, 165, 133],
[ 37, 111, 34, ..., 144, 39, 139]], dtype=uint8)
python中的转换速度比cpp慢约4倍。
有没有有效的方法在python中做同样的事情?
如果您需要进一步的信息以供澄清,请与我们联系。
答案 0 :(得分:0)
看起来这些是NumPy数组。如果是这样,你可以做
matrix_2[1::2, ::2] = matrix_1[::2, 1::2]
避免Python级循环和包装器对象构造的开销。
答案 1 :(得分:0)
for Row in range(len(matrix_1)/2):
Row *= 2
for Col in range(len(matrix_1[0])/2):
Col *= 2
matrix_2[Row + 1, Col] = matrix_1[Row, Col + 1]
实际上,我在一个函数中写的上面的代码,我一次又一次地调用。我问了这个改进的问题。
在此代码中,重复调用此matrix_2[Row + 1, Col] = matrix_1[Row, Col + 1]
是耗时的,这只是检查索引并复制到另一个矩阵。
x = np.arange (0, num_of_row_of_matrix_1*num_of_col_of_matrix_1).reshape(num_of_row_of_matrix_1, num_of_col_of_matrix_1)
h1, w1 = np.where (np.logical_and ( ((x/num_of_col_of_matrix_1)%2 == 0), (x%2 == 1)))
h2, w2 = np.where (np.logical_and ( ((x/num_of_col_of_matrix_1)%2 == 1), (x%2 == 0)))
这给了我必须复制的索引。由于这些索引是固定的,我需要复制,所以我把它保留在函数之外。然后,在函数中,我只是复制所选的索引,如matrix_2[h2, w2] = matrix_1[h1, w1]
,这不需要时间。