为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中将一个矩形划分为NxM矩形并对其进行编号

在Python中将一个矩形划分为NxM矩形并对其进行编号

慕田峪4524236 2023-07-27 09:59:44
所以我有一个大小为 104x68 的矩形,并将该矩形分成 36 个相等的部分。图像中的数字代表每个小矩形的坐标位置。现在我想对每个矩形进行编号,如下图所示:IEFor coordinate location x = [0, 17.3] and y = [0, 11.3] will be number 1 boxFor coordinate location x = (17.3, 34.6] and y = [0, 11.3] will be number 2 box....For coordinate location x = (86.6, 104] and y = (56.6, 68] will be number 36 box对每个框进行编号后,我希望:给定一个值(54,35),程序将生成该特定值的框编号,对于给定值(54, 35),框编号将为 22。在Python中解决这个问题的优化方法是什么?有人可以帮忙吗?
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

下面,您可以通过输入所需的参数来获取矩形编号。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)四个主要操作。


查看完整回答
反对 回复 2023-07-27
?
慕码人8056858

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。


查看完整回答
反对 回复 2023-07-27
  • 2 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信