如何有效地将C / C ++逻辑转换为python?

时间:2017-08-04 07:17:06

标签: python c++ c python-2.7

我有一个.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中做同样的事情?

如果您需要进一步的信息以供澄清,请与我们联系。

2 个答案:

答案 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],这不需要时间。