2 回答
TA贡献1906条经验 获得超3个赞
下面,您可以通过输入所需的参数来获取矩形编号。weight并height显示矩形的尺寸(在您的示例中为width = 104, height = 68)。xpartition和ypartition参数显示每个维度的划分数(在您的示例中,36 等分意味着xpartition = 6, ypartition = 6)。xinput和yinput是查询点的尺寸,需要知道其在指定分区中的矩形数(在您的示例中为xinput = 54, yinput = 35)。
import math
def get_rect_num(width, height, xpartition, ypartition, xinput, yinput):
x_step = width / xpartition
y_step = height / ypartition
x = math.ceil((xinput if xinput > 0 else 0.5) / x_step) # handle border cases as well
y = math.ceil((yinput if yinput > 0 else 0.5) / y_step) # handle border cases as well
return (y-1) * xpartition + x
get_rect_num(104, 68, 6, 6, 54, 35)
#> 22
上述计算的时间复杂度基于Theta(1)四个主要操作。
TA贡献1803条经验 获得超6个赞
不是最优化的方法(您可以使用itertools),但一种相当紧凑的方法就是使用numpy.arange。假设这是您的实际任务,我不明白为什么该方法需要比这更优化。
import numpy as np
SMALL_NUM = 1e-5
def range_pairs(max_value, divisions):
division_length = max_value/divisions
range_values = list(np.arange(0, max_value+SMALL_NUM, division_length))
return [(range_values[i], range_values[i+1]) for i in range(divisions)]
i = 0
for y in range_pairs(68, 6):
for x in range_pairs(104, 6):
i += 1
print(f"For coordinate location x = {x} and y = {y} will be number {i} box")
对于较大的任务,请考虑itertools,并考虑预先计算range_pairs以下内容,或lru_cache在函数上添加一个range_pairs。
添加回答
举报