Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 交换二维矩阵的两列和相同行的最快方法是什么?_Python_Numpy_Matrix_Optimization - Fatal编程技术网

Python 交换二维矩阵的两列和相同行的最快方法是什么?

Python 交换二维矩阵的两列和相同行的最快方法是什么?,python,numpy,matrix,optimization,Python,Numpy,Matrix,Optimization,我有一个问题,需要找到列/行的最佳排列。所以,当我用列j交换列I时,我必须交换行I和行j。分数应用于结果矩阵(模拟退火) 它能工作,但我想知道它是否能更快 我做什么 我试过的 代码是:152642.58交换/秒-158248.08交换/秒 cm[:,[i,j]]=cm[:,[j,i]]用于交换列:90562.43交换/秒-97625.79交换/秒 在我看来效率很高。另一种方法是只存储要交换的对,而不实际执行交换吗? #!/usr/bin/env python """Swap rows and

我有一个问题,需要找到列/行的最佳排列。所以,当我用列j交换列I时,我必须交换行I和行j。分数应用于结果矩阵(模拟退火)

它能工作,但我想知道它是否能更快

我做什么 我试过的
  • 代码是:152642.58交换/秒-158248.08交换/秒
  • cm[:,[i,j]]=cm[:,[j,i]]
    用于交换列:90562.43交换/秒-97625.79交换/秒

在我看来效率很高。另一种方法是只存储要交换的对,而不实际执行交换吗?
#!/usr/bin/env python

"""Swap rows and colums of a square integer matrix simultaneously."""

import numpy as np
import random
random.seed(0)


def swap(cm, i, j):
    """
    Swap row and column i and j in-place.

    Examples
    --------
    >>> cm = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
    >>> swap(cm, 2, 0)
    array([[8, 7, 6],
           [5, 4, 3],
           [2, 1, 0]])
    """
    # swap columns
    copy = cm[:, i].copy()
    cm[:, i] = cm[:, j]
    cm[:, j] = copy
    # swap rows
    copy = cm[i, :].copy()
    cm[i, :] = cm[j, :]
    cm[j, :] = copy
    return cm


def main(n):
    import time
    cm = np.random.randint(0, 150000, size=(n, n))
    swaps = 10**6

    t0 = time.time()
    for step in range(swaps):
        # Choose what to swap
        i = random.randint(0, n - 1)
        j = i
        while j == i:
            j = random.randint(0, n - 1)
        cm = swap(cm, i, j)
    t1 = time.time()
    print("{:0.2f} swaps / sec".format(swaps / (t1 - t0)))

if __name__ == '__main__':
    import doctest
    doctest.testmod()
    main(369)