Python: автоматизация генерации переменного числа операторов if - PullRequest
0 голосов
/ 30 августа 2018

У меня есть два подобных массива, которые представляют координаты:

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

Учитывая мои два массива, это возвращает:

In[1]: count1, count2, count3, count4
Out[1]: (1, 3, 4, 0)

Мои настоящие проблемы состоят из переменного числа квадратов (это может быть 6, это может быть 36 и т. Д.).

Есть ли способ автоматизировать генерацию переменных count, а также количество и границы операторов if?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Вы не перечислите весь свой код, поэтому неясно, что именно вы пытаетесь сделать. В любом случае, вы можете описать каждый квадрат с помощью кортежа

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
0 голосов
/ 30 августа 2018

Это тот случай, когда массив очень полезен.

Вместо того, чтобы создавать отдельные countn переменные, вы можете создать массив count и индексировать в этот массив (таким образом, count0 становится count[0], count1 до count[1] и т. Д.).

Теперь хитрость заключается в том, чтобы просто сопоставить координаты x и y определенному индексу массива счетчиков, что вы можете сделать с помощью некоторой математики. то есть, если квадраты 3х3 и расположены в большом прямоугольнике, тогда x // 3 + (y // 3) * num_squares_per_row даст вам ваш индекс.

В случае, если ваши регионы, которые вы пытаетесь сосчитать, не одинаковы, поэтому вы не можете придумать простое математическое уравнение, вы всегда можете составить словарь, отображающий то, что вы хотите сосчитать, с их индексами в массиве count и используйте его, чтобы выяснить, какой индекс увеличивать при заданном входе.

...