Как я могу создать список логических значений R = 10000, вызываемых внутри в Python? - PullRequest
0 голосов
/ 22 сентября 2018
import random, math

random.seed(1)

def in_circle(x, origin = [0]*2):
    """
        This function determines if a two-dimensional point
        falls within the unit circle.
    """
    if len(x) != 2:
        return "x is not two-dimensional!"
    elif distance(x, origin) < 1:
        return True
    else:
        return False

print(in_circle((1,1)))

Далее я хочу определить, попадает ли каждая точка в x в единичный круг с центром в (0,0), используя функцию "in_circle".Как мне это сделать?Мой уровень программирования - Начинающий

Ответы [ 4 ]

0 голосов
/ 22 сентября 2018

Если вы начинающий программист, вам будет полезно взглянуть и на эти концепции, они пригодятся вам в будущем программисту:

map, lambda и generators.

  1. Вы можете определить простые функции, используя лямбда-функции.

As:

in_circle = lambda (x, y): True if Math.sqrt( Math.pow(x,2) + Math.pow(y,2) ) < 1 else False
# assuming circle has center 0, 0  and radius 1

2.и затем сопоставьте функцию со списком точек:

map( in_circle, your_list)

Обратите внимание, что в лямбде синтаксис (x, y) состоит в том, что вы передаете кортеж в качестве одного аргумента, и ваш список формируется следующим образом:

your_list = [(0,1),(0, 0.5), (0.3, 0.4) ...]

3.Вместо списка вы также можете использовать генератор, структура, очень удобная в итерациях, если вам не нужно снова использовать ваш список. Синтаксис

аналогичен (обратите внимание на скобки! (VS [)

your_point = [ (random.random(), random.random()) for i in range(n)  ] 
# list comprehension

your_point = (  (random.random(), random.random()) for i in range(n)  )
# generator

4. Таким образом, вы можете сгенерировать список из N логических значений, таких как:

n = 10000
your_point = ( (random.random(), random.random()) for i in range(n) )
bool_list = map( in_circle, your_list)

Чтобы узнать о разнице между lamdba и обычными функциями, см. Также: what isразница для Python между лямбда-выражением и обычной функцией?

Для вашего интереса к пониманию списков генераторов VS: Выражения генераторов и понимание списков

0 голосов
/ 22 сентября 2018

Привет. Просто поместите свои 1000 точек или любое количество координат в список ниже и запустите свою функцию над ними, используя цикл, и вы получите свои логические значения в списке X. Например:

 x=[] #declare an empty list where boolean value needs to be stored
li=[(1,1),(0,0),(-1,1)]

for i in range(0,len(li)):
    x1=in_circle(li[i])
    x.append(x1)
0 голосов
/ 22 сентября 2018

Как я понимаю, у вас есть список кортежей, подобных этому

l = [(x1, y1),
     (x2, y2),
     ...
     (x10000, y10000)]

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

bools = []
for xy in l: # xy is tuple
    bools.append(in_circle(xy))

это был начальный уровень, но есть еще более изящный способ сделать это:

bools = [in_circle(xy) for xy in l]
0 голосов
/ 22 сентября 2018

Я не знаю, как выглядит ваша distance функция, но при условии, что ваша переменная x, переданная в функцию, имеет 10000 точек, это способ, которым вы можете вычислить свой логический массив.При вызове функции in_circle вы можете передать свой массив / список из всех 10000 точек и заменить [(1,1), (1,2), (2,2)]) в in_circle([(1,1), (1,2), (2,2)]) на ваш массив / список, содержащий точки.Дайте мне знать, если это не сработает.

В этом решении вы вызовете функцию in_circle один раз, передав все 10000 точек вместе, а затем цикл for вычислит расстояния внутри функции.,На мой взгляд, это лучше, чем выводить цикл for снаружи и вызывать функцию 10000 раз для каждой точки один за другим.

import random, math

random.seed(1)

def in_circle(x, origin = [0]*2):
    bool_array = []
    for point in x: # assuming x contains 10000 points
        if len(x) != 2:
            print ("x is not two-dimensional!")
            continue
        elif distance(x, origin) < 1:
            bool_array.append(True) 
        else:
            bool_array.append(False) 
    return bool_array

bool_array = in_circle([(1,1), (1,2), (2,2)])
...