Python:自动生成可变数量的 if 语句
Python: automating the generation of a variable number of if statements
我有两个类似于这些的numpy数组,它们代表坐标:
import numpy as np
x=np.array([1,3,2,4,6,5,4,1])
y=np.array([4,4,3,2,2,1,3,5])
我还有n
个方块:
s1 -> x=0 to 3, y=0 to 3
s2 -> x=3 to 6, y=3 to 6
s3 -> ...
s4 -> ...
我想计算落在每个正方形内的点数。这归结为评估 n
不等式。
我的方法冗长且(可能)效率低下:
count1=0
count2=0
count3=0
count4=0
for j in range(0, len(x)):
#Square 1
if x[j]<=3 and y[j]<=3:
count1+=1
#Square 2
if x[j]<=3 and y[j]>3 and y[j]<=6:
count2+=1
#Square 3
if x[j]>3 and x[j]<=6 and y[j]<=3:
count3+=1
#Square 4
if x[j]>3 and x[j]<=6 and y[j]>3 and y[j]<=6:
count4+=1
鉴于我的两个数组,这个 returns:
In[1]: count1, count2, count3, count4
Out[1]: (1, 3, 4, 0)
我的实际问题由数量可变的方块组成(可能是 6 个,也可能是 36 个,等等)。
有没有一种方法可以自动生成 count
变量以及 if
语句的数量和边界?
这是数组非常有用的情况。
与其创建单独的 countn
变量,不如创建一个计数数组,并索引到该数组(因此 count0
变为 count[0]
,count1
到 count[1]
,依此类推)。
现在的诀窍就是将 x 和 y 坐标映射到特定的计数数组索引,这只需一些数学运算即可完成。即,如果正方形为 3x3 并排列成一个大矩形,则 x // 3 + (y // 3) * num_squares_per_row
将为您提供索引。
如果您要计算的区域不统一,因此您无法想出一个简单的数学方程式,您可以随时制作一个字典来映射您要计算的对象它们在 count
数组中的索引,并使用它来确定给定特定输入要增加的索引。
您没有列出全部代码,因此不清楚您到底想做什么。在任何情况下,你都可以用一个元组的元组来描述每个方块
square_n = ((x1, x2), (y1, y2))
并将它们放入字典中,其中键为该元组,值为计数。然后,像
for square in squares_dict:
(x1, x2), (y1, y2) = square
if x1<a<x2 and y1<b<y2: # whatever criterion you have
squares_dict[square] += 1
我有两个类似于这些的numpy数组,它们代表坐标:
import numpy as np
x=np.array([1,3,2,4,6,5,4,1])
y=np.array([4,4,3,2,2,1,3,5])
我还有n
个方块:
s1 -> x=0 to 3, y=0 to 3
s2 -> x=3 to 6, y=3 to 6
s3 -> ...
s4 -> ...
我想计算落在每个正方形内的点数。这归结为评估 n
不等式。
我的方法冗长且(可能)效率低下:
count1=0
count2=0
count3=0
count4=0
for j in range(0, len(x)):
#Square 1
if x[j]<=3 and y[j]<=3:
count1+=1
#Square 2
if x[j]<=3 and y[j]>3 and y[j]<=6:
count2+=1
#Square 3
if x[j]>3 and x[j]<=6 and y[j]<=3:
count3+=1
#Square 4
if x[j]>3 and x[j]<=6 and y[j]>3 and y[j]<=6:
count4+=1
鉴于我的两个数组,这个 returns:
In[1]: count1, count2, count3, count4
Out[1]: (1, 3, 4, 0)
我的实际问题由数量可变的方块组成(可能是 6 个,也可能是 36 个,等等)。
有没有一种方法可以自动生成 count
变量以及 if
语句的数量和边界?
这是数组非常有用的情况。
与其创建单独的 countn
变量,不如创建一个计数数组,并索引到该数组(因此 count0
变为 count[0]
,count1
到 count[1]
,依此类推)。
现在的诀窍就是将 x 和 y 坐标映射到特定的计数数组索引,这只需一些数学运算即可完成。即,如果正方形为 3x3 并排列成一个大矩形,则 x // 3 + (y // 3) * num_squares_per_row
将为您提供索引。
如果您要计算的区域不统一,因此您无法想出一个简单的数学方程式,您可以随时制作一个字典来映射您要计算的对象它们在 count
数组中的索引,并使用它来确定给定特定输入要增加的索引。
您没有列出全部代码,因此不清楚您到底想做什么。在任何情况下,你都可以用一个元组的元组来描述每个方块
square_n = ((x1, x2), (y1, y2))
并将它们放入字典中,其中键为该元组,值为计数。然后,像
for square in squares_dict:
(x1, x2), (y1, y2) = square
if x1<a<x2 and y1<b<y2: # whatever criterion you have
squares_dict[square] += 1