感谢您的提示,我想为您的答案添加评论,但有 500 个标志的限制,因此我将其发布为答案。我尝试使用多处理的方式,即 for 循环将在单一条件下同时运行 6 次,例如 x_squared_Cm + y_squared_C[vm]
import concurrent.futures
import numpy as np
def loop_1(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_1 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if w_tr[1, 2] <= y[vm] < w_tr[1, 0] and w_tr[0, 0]-r <= x[m] < w_tr[0, 1]+r:
A_1[vm, m] = 1
else:
continue
return A_1
def loop_2(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_2 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if w_tr[1, 2]-r <= y[vm] < w_tr[1, 0]+r and w_tr[0, 0] <= x[m] < w_tr[0, 1]:
A_2[vm, m] = 1
else:
continue
return A_2
def loop_3(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_3 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if x_squared_A[m] + y_squared_A[vm] < r_squared:
A_3[vm, m] = 1
else:
continue
return A_3
def loop_4(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_4 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if x_squared_B[m] + y_squared_B[vm] < r_squared:
A_4[vm, m] = 1
else:
continue
return A_4
def loop_5(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_5 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if x_squared_C[m] + y_squared_C[vm] < r_squared:
A_5[vm, m] = 1
else:
continue
return A_5
def loop_6(i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B, y_squared_C, y_squared_D, r_squared, max_r):
A_6 = A
for m in range(int(0.5 * i - max_r - 2), int(0.5 * i + max_r + 2)):
for vm in range(int(0.5 * j - max_r - 2), int(0.5 * j + max_r + 2)):
if x_squared_D[m] + y_squared_D[vm] < r_squared:
A_6[vm, m] = 1
else:
continue
return A_6
def main():
w = 30
h = 150
r = 50
A = np.zeros((2000, 2000))
(i, j) = A.shape # i,j współrzędne macierzy, x,y współrzędne układu
x = list(range(int(-0.5 * i), int(0.5 * i), 1))
y = list(range(int(-0.5 * j), int(0.5 * j), 1))
wierzcholki = np.array([(-0.5 * w, 0.5 * h), (0.5 * w, 0.5 * h), (0.5 * w, -0.5 * h), (-0.5 * w, -0.5 * h)]).T
w_tr = wierzcholki
x_squared_A = list((np.array(x) - w_tr[0, 0]) ** 2)
y_squared_A = list((np.array(y) - w_tr[1, 0]) ** 2)
x_squared_B = list((np.array(x) - w_tr[0, 1]) ** 2)
y_squared_B = list((np.array(y) - w_tr[1, 1]) ** 2)
x_squared_C = list((np.array(x) - w_tr[0, 2]) ** 2)
y_squared_C = list((np.array(y) - w_tr[1, 2]) ** 2)
x_squared_D = list((np.array(x) - w_tr[0, 3]) ** 2)
y_squared_D = list((np.array(y) - w_tr[1, 3]) ** 2)
r_squared = r ** 2
max_r = np.sqrt(
(0.5 * w + r) ** 2 + (0.5 * h + r) ** 2)
args = [i,j, r, A, x, y, w_tr, x_squared_A, x_squared_B, x_squared_C, x_squared_D, y_squared_A, y_squared_B,
y_squared_C, y_squared_D, r_squared, max_r]
with concurrent.futures.ProcessPoolExecutor() as executor:
results = [executor.map(loop_1, args),
executor.map(loop_2, args),
executor.map(loop_3, args),
executor.map(loop_4, args),
executor.map(loop_5, args),
executor.map(loop_6, args)]
for result in results:
A += result
if __name__ == '__main__':
main()