Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.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 在2D列表中交换0和1的最快方式_Python_List_Nested Lists - Fatal编程技术网

Python 在2D列表中交换0和1的最快方式

Python 在2D列表中交换0和1的最快方式,python,list,nested-lists,Python,List,Nested Lists,假设我有一个矩阵: [[1, 1, 1, 0, 0,], [0, 1, 0, 1], [1, 0, 1]] 我想把它改成: [[0, 0, 0, 1, 1,], [1, 0, 1, 0], [0, 1, 0]] 处理这个案子最快的方法是什么 目前,我在另一个for循环中使用for循环,如下所示,这显然太慢了 for my_row in my_mat: for my_val in my_row: my_val = 1 if my_val == 0 else 0 我不认为它慢

假设我有一个矩阵:

[[1, 1, 1, 0, 0,], [0, 1, 0, 1], [1, 0, 1]]
我想把它改成:

[[0, 0, 0, 1, 1,], [1, 0, 1, 0], [0, 1, 0]]
处理这个案子最快的方法是什么

目前,我在另一个for循环中使用for循环,如下所示,这显然太慢了

for my_row in my_mat:
   for my_val in my_row:
      my_val = 1 if my_val == 0 else 0

我不认为它慢,但它不是最快的。这里有一些更快的选择

减法超简单 这样就不需要进行if检查。不过,只有当您有一个0/1的列表并且只想翻转这些值时,这才有意义

位用异或翻转 一般来说,XOR运算速度很快,所以如果您的正值超过1,那么这是一个很好的选择

不倒置 请注意,这会将非零值压缩为1。not将整数转换为truthy/falsy值,随后的int将False转换为0,或将True转换为1

如果您对此处建议的所有方法的性能感兴趣

lst = np.random.choice(2, (1000, 1000)).tolist()

%timeit [[int(not j) for j in i] for i in lst]
%timeit [[j ^ 1 for j in i] for i in lst]
%timeit [[1 - j for j in i] for i in lst]

10 loops, best of 3: 175 ms per loop
10 loops, best of 3: 89.8 ms per loop
10 loops, best of 3: 61.1 ms per loop

我不认为它慢,但它不是最快的。这里有一些更快的选择

减法超简单 这样就不需要进行if检查。不过,只有当您有一个0/1的列表并且只想翻转这些值时,这才有意义

位用异或翻转 一般来说,XOR运算速度很快,所以如果您的正值超过1,那么这是一个很好的选择

不倒置 请注意,这会将非零值压缩为1。not将整数转换为truthy/falsy值,随后的int将False转换为0,或将True转换为1

如果您对此处建议的所有方法的性能感兴趣

lst = np.random.choice(2, (1000, 1000)).tolist()

%timeit [[int(not j) for j in i] for i in lst]
%timeit [[j ^ 1 for j in i] for i in lst]
%timeit [[1 - j for j in i] for i in lst]

10 loops, best of 3: 175 ms per loop
10 loops, best of 3: 89.8 ms per loop
10 loops, best of 3: 61.1 ms per loop

最快的算法是保持矩阵不变。请记住,在一个单独的标志中,您读取或写入的每个值都必须反转。完成了


但是如果你实际需要反转矩阵中的每个值,那么只有一个算法——你已经发现的算法。剩下的不是algo,而是该算法最有效的实现。

最快的算法是保持矩阵不变。请记住,在一个单独的标志中,您读取或写入的每个值都必须反转。完成了


但是如果你实际需要反转矩阵中的每个值,那么只有一个算法——你已经发现的算法。剩下的不是关于算法,而是关于该算法最有效的实现。

显然太慢了——没有更快的算法。您需要查看每个值,以确定是否需要翻转它=>Onm in n,m矩阵的维数。为什么这显然太慢了?除非您对矩阵中的数据有所了解,否则如果您想将0与1交换,并将1与0交换,那么您别无选择,只能触摸ever元素,因为速度太慢了—没有更快的算法。您需要查看每个值,以确定是否需要翻转它=>Onm in n,m矩阵的维数。为什么这显然太慢了?除非你对矩阵中的数据有所了解,否则别无选择,如果你想用1交换0,用0交换1,这很可爱。也许j^1是另一种选择?@trincot哦,是的!按位。。。这应该更快。介意我加上吗?一点也不介意。去做吧-@谢谢你的建议!有趣的是,如果发现它没有第一个选项快,但仍然很快。嘿,这很可爱。也许j^1是另一个选项?@trincot哦,是的!按位。。。这应该更快。介意我加上吗?一点也不介意。去做吧-@谢谢你的建议!有趣的是,如果发现它没有第一个选项那么快,但仍然很快。
>>> [[int(not j) for j in i] for i in lst]
[[0, 0, 0, 1, 1], [1, 0, 1, 0], [0, 1, 0]]
lst = np.random.choice(2, (1000, 1000)).tolist()

%timeit [[int(not j) for j in i] for i in lst]
%timeit [[j ^ 1 for j in i] for i in lst]
%timeit [[1 - j for j in i] for i in lst]

10 loops, best of 3: 175 ms per loop
10 loops, best of 3: 89.8 ms per loop
10 loops, best of 3: 61.1 ms per loop