你第二次尝试的进步import numpy as np
import time
answer = 0
def findLargestSquare(board):
global answer
a = np.array(board)
for k in reversed(range(a[0].size + 1)):
conv_size = k
for i in range(a[0].size - conv_size + 1):
num = i
for j in range(a[0].size - conv_size + 1):
#print('i:', i, 'j:', j)
print(a[i:i + conv_size, j:j + conv_size])
#print('unique: ',np.unique(a[i:i+ conv_size,j:j+conv_size]).size)
if(np.unique(a[i:i+ conv_size,j:j+conv_size]).size == 1):
#print("returning")
return len(a[i:i+ conv_size,j:j+conv_size])**2
num = num + 1
print("================")
return len(a[i:i+ conv_size,j:j+conv_size])**2
answer
是不必要的,而且没有任何用处。当然不需要在算法中使用global
变量重命名
conv_size = k和{}是不必要的。如果您想这样命名它们,那么在for循环中这样做,num甚至在算法的其余部分中都没有使用
range(a[0].size)
这样每次都会创建一个新数组(或者一个view,我不能百分之百确定),如果a[1]更短,就会出现问题。max_size = min(a.shape)更干净
双for循环
可以使用itertools.product生成子正方形边的坐标,而不是循环两次
^{pr2}$
返回具有以下结果的生成器:[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]
支票本身if(np.unique(a[i:i+ conv_size,j:j+conv_size]).size == 1):
#print("returning")
return len(a[i:i+ conv_size,j:j+conv_size])**2
不需要创建array或view的双重创建,就可以做得更干净sub_square = a[i:i+size, j:j+size]
if len(np.unique(sub_square)) == 1:
return len(sub_square) ** 2
# calculations
合并import itertools
import numpy as np
def findLargestSquare(board):
a = np.array(board)
max_size = min(a.shape)
for size in reversed(range(2, max_size + 1)):
# print('looking for identical squares of size: ', size)
k = max_size - size + 1
for i, j in itertools.product(range(k), repeat=2):
# print('checking position: ', (i, j))
sub_square = a[i:i+size, j:j+size]
count = len(np.unique(sub_square))
# print(count, ' elements in: \n', sub_square)
if count == 1:
return len(sub_square) ** 2
# if you also want to know the position, you could do
# return len(sub_square) ** 2 , (i, j)
# print("================")
return 1 # no squares found