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