Идиоматическая реализация Python для конечных множеств, изображений и прообразов конечных функций? - PullRequest
0 голосов
/ 28 декабря 2018

Предположим, у меня есть конечная конкретная функция между конечными множествами.Конечно, в Python наборы реализованы изначально.

Но как лучше точно реализовать идею конечной функции между наборами?Завернутый словарь?Кроме того, как можно реализовать расчеты изображений и изображений?[См. Ниже.]

Для изображений я могу использовать карту, ясно.Для прообразов я могу перебрать набор доменов и отфильтровать.Тем не менее, я задаюсь вопросом о более питоническом идиоматическом решении.

Википедия: Изображения (математика)

Ответы [ 2 ]

0 голосов
/ 29 мая 2019
def preimage(b: B, f: Dict[A, B]) -> Set[A]: 
    ''' get the preimage of one item. '''
    return set(a for a in f.keys() if f[a]==b)

Это предполагает TypeVar и другие вещи из pep484

from typing import TypeVar, Dict, Set
A = TypeVar('A')
B = TypeVar('B')

Без аннотации типа это выглядит следующим образом

def preimage(b, f): 
  ...

или подмножествокодомен

from typing import Collection
from functools import reduce

def preimage_(bs: Collection[B], f: Dict[A, B]) -> Set[A]: 
    ''' get the preimage of a collection of items '''
    return reduce(lambda a, b: a.union(b), [preimage(b, f) for b in bs])
0 голосов
/ 28 декабря 2018

Для произвольных изображений из набора в другой, я бы использовал словарь Python.Например, f (n) = n ^ 2 на наборе {1,2,3,4}, я могу сделать это:

preimage = set([1,2,3,4])
mapping = {x: x*x for x in preimage}
image = set(mapping.values())
assert set(mapping.keys()) == preimage
function = lambda x: mapping[x] # so you can now have y = function(x)
check_image = set([function(x) for x in preimage])
assert check_image == image

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

Выше приведен наиболее общий случай, когда вы определяете функцию как отображение.Но в случае более простой функции, которую вы можете использовать в выражении Python для ее представления, вы можете пропустить словарь:

preimage = set([1,2,3,4])
function = lambda x: x*x
image = set([function(x) for x in preimage])
check_preimage = set([y for x in image for y in preimage if function(y)==x])
assert check_preimage == preimage

И если далее, у вас есть обратная функция, доступная для домена:

import math
preimage = set([1,2,3,4])
function = lambda x: x*x
inv_func = lambda x: int(math.sqrt(x))
image = set([function(x) for x in preimage])
check_preimage = set([inv_func(x) for x in image])
assert check_preimage == preimage

Обратите внимание, что из трех приведенных выше фрагментов кода только первый гарантирует, что function(x) разрешит только те x в предопределенном прообразе.

Говоря об идиомальном питоне: я не понимаюЯ не думаю, что Python действительно такой математический язык (сравните, скажем, математику Вольфрама), поэтому у нас нет встроенной концепции изображения, отображения и т. д.Тем не менее, вы можете увидеть мой код выше с пониманием списка.В самом деле, я просто сделал более понятным использование ключевого слова set, как в set([function(x) for x in preimage]), но вы можете сохранить несколько нажатий клавиш с помощью {function(x) for x in preimage}.

...