Молекулярный конструктор 1 питон задача

Обновлено: 17.04.2024

Вторая часть заметок об объектной системе python'a (первая часть тут). В этой статье рассказывается, что такое классы, метаклассы, type, object и как происходит поиск атрибутов в классе.

Классы

Классы (типы) — это объектные фабрики. Их главная задача — создавать объекты, обладающие определенным поведением.

Классы определяют поведение объектов с помощью своих атрибутов (которые хранятся в __dict__ класса): методов, свойств, классовых переменные, дескрипторов, а также с помощью атрибутов, унаследованных от родительских классов.

Инстанцирование обычного объекта происходит в 2 этапа: сначала его создание, потом инициализация. Соответственно, сначала запускается метод класса __new__, который возвращает объект данного класса, потом выполняется метод класса __init__, который инициализирует уже созданный объект.

def __new__(cls, . ) — статический метод (но его можно таковым не объявлять), который создает объект класса cls.

def __init__(self, . ) — метод класса, который инициализирует созданный объект.

Например, объявим класс:

>>> class A ( object ):
. pass
.
>>>

Для класса A не определены ни __new__, ни __init__. В соответствии с алгоритмом поиска атрибутов для класса (типа), который не стоит путать с алгоритмом поиска атрибутов для обычных объектов, когда класс не найдет их в своем__dict__, он будет искать эти методы в __dict__ своих базовых (родительских) классах.

Класс А имеет в качестве родителя встроенный класс object. Таким образом он будет их искать в object.__dict__

Раз есть такие методы, значит, получается, что a = A() аналогичен последовательности вызовов:

a = object.__new__(A)
object.__init__(a)

В общем виде, используя super, который как раз и реализует алгоритм поиска атрибутов по родительским классам [1]:

a = super(A, A).__new__(A)
super(A, A).__init__(a)

>>> class A ( object ):
. def __new__ (cls):
. obj = super (A, cls) . __new__(cls)
. print 'created object' , obj
. return obj
. def __init__ ( self ):
. print 'initing object' , self
.
>>> A()
created object
initing object

>>>

Singleton v.1

Понимая, как происходит создание объекта, можно написать реализацию паттерна одиночка.

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

А это значит, что при вызов метода __new__ должен возвращать каждый раз один и тот же объект. Хранить сам объект можно, например, в классовой переменной instance.

В результате получаем:

>>> class C ( object ):
. instance = None
. def __new__ (cls):
. if cls . instance is None :
. cls . instance = super (C, cls) . __new__(cls)
. return cls . instance
.
>>> C() is C()
True
>>> C() . x = 1
>>> c = C()
>>> d = C()
>>> c . x
1
>>> d . x
1
>>> c . x =2
>>> d . x
2
>>> c . x
2

Классы и метаклассы.

Для класса (типа), так же как и для обычного объекта, существует класс (тип), который создает классы и определяет поведение класса. Этот класс называется метаклассом.

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

XClass = XMetaClass(name, bases, attrs)

Тогда, сразу после создания
XClass.__name__ равно name,
XClass.__bases__ равен bases,
XClass.__dict__ равен attrs, а
XClass.__class__ равен XMetaClass

По умолчанию для всех определяемых классов метаклассом является type.

>>> class A ( object ):
. pass
.

Эквивалентно, по аналогии с обычными объектами:

>>> type ( 'A' , ( object ,), <>)

>>> class B (A):
. def foo ( self ):
. 42
.

При определении класса, можно задать свой метакласс с помощью
классовой переменной __metaclass__:

>>> class A ( object ):
. __metaclass__ = Meta
.
>>>

Что равносильно: A = Meta('A', (object,), <>)

О type и object

Прежде всего type и object — это объекты. И, как у всех порядочных объектов, у них есть специальные атрибуты __class__ и __dict__:

>>> object . __class__

>>> type . __class__

>>> object . __dict__

>>> type . __dict__

Более того object, и type — это объекты типа (классы), и у них тоже есть специальные атрибуты __name__, __bases___:

>>> object . __name__
'object'
>>> type . __name__
'type'
>>> object . __bases__
()
>>> type . __bases__
(,)
>>>

Экземпляры типа или класса object — это объекты (любые). Т.е. любой объект — экземпляр класса object:

>>> isinstance ( 1 , object )
True
>>> isinstance ( setattr , object )
True
>>> isinstance ( "foo" , object )
True
>>> isinstance (A, object )
True

Даже функция является объектом:
>>> def bar ():
. pass
.
>>> isinstance (bar, object )
True

Кроме того, класс object сам является своим экземпляром:

>>> isinstance ( object , object )
True

type тоже является его экземпляром:

>>> isinstance ( type , object )
True

Инстанцирование — object() возвращает самый простой и общий объект:

>>> o = object ()

У которого даже __dict__ нет, есть только __class__.

>>> o . __dict__
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'object' object has no attribute '__dict__'
>>> o . __class__

>>>

Экземпляры класса или типа type — это только другие классы или другие типы:

Число — это не класс

>>> isinstance ( 1 , type )
False

>>> isinstance ( "foo" , type )
False

Встроенная функция setattr тоже не класс.

>>> isinstance ( setattr , type )
False

Класс — это класс.

>>> isinstance (A, type )
True

Тип строки — это класс.

>>> isinstance ( "foo" . __class__, type )
True

Т.к. object и type — тоже классы, то они являются экземплярами класса type:

>>> isinstance ( object , type )
True
>>> isinstance ( type , type )
True
>>>

Т.к. множество классов (типов) являются подмножеством множества объектов, то логично предположить, что type является подклассом object, т.е.

>>> issubclass ( type , object )
True
>>> issubclass ( object , type )
False

type — это просто класс, экземплярами которого являются другие классы. (т.е. метакласс). А сами классы можно считать расширением простых, обычных объектов.

Таким образом, когда мы наследуем класс от object, этот класс автоматически наследует поведение класса object, т.е. при инстанцировании он будет возвращать обычный объект. А когда мы наследуем от класса type, мы также автоматически наследуем поведение класса type, т.е. при инстацированни будет создаваться класс. А класс, который создает класс, называется метаклассом.

Значит, чтобы определить просто класс, нужно наследовать его от object, чтобы определить метакласс — наследуем его от type.

И еще: не нужно путать type(a) и type(name, bases, attrs).
type(a) — вызов с одним аргументом, возвращает тип объекта,
a type(name, bases, attrs) — вызов с тремя аргументами — это вызов конструктора класса.

О поиске атрибутов в классе

Как уже было отмечено, алгоритм поиска атрибутов в обычном объекте, но есть некоторые тонкости, т.к. у типов (классов) есть __bases__ — родительские классы (типы).

Если атрибут есть в __dict__ возвращается он, затем идет поиск по базовым классам из __bases__, а потом идет обращение к __dict__ __class__'а (т.е. фактически метакласса) и его (метакласса) родительских классов (метаклассов).

>>> class Ameta ( type ):
. def foo (cls):
. print 'Ameta.foo'
.
>>> class A ( object ):
. __metaclass__ = Ameta
.
>>> A . foo()
Ameta.foo

Все что определяется в метаклассе доступно для класса, но не доступно для экзмепляров класса — обычных объектов, т.к. поиск атрибутов в обычном объекте ведется только по __dict__ словарям класса.

>>> a = A()
>>> a . foo
Traceback (most recent call last):
File "" , line 1 , in
AttributeError : 'A' object has no attribute 'foo'

В A.__dict__ 'foo' нет:

>>> A . __dict__[ 'foo' ]
Traceback (most recent call last):
File "" , line 1 , in
KeyError : 'foo'

Зато он есть в метаклассе, поэтому:

>>> A . foo()
Ameta.foo

Экземпляр класса C также вызовет метод foo из класса B.

>>> c = C()
>>> c . foo()
B.foo

>>> class D (A):
. pass
.
>>> D . foo()
Ameta.foo

А экземпляр D не найдет:

>>> d = D()
>>> d . foo()
Traceback (most recent call last):
File "" , line 1 , in
AttributeError : 'D' object has no attribute 'foo'

Метаклассы

Метаклассы являются фабриками классов (или типов). Инстанцирование класса тоже проходит в 2 этапа — создание объекта типа (класса) и его инициализация. Это также делается с помощью двух методов метакласса. Сначала вызывается метод __new__ метакласса с параметрами, необходимыми для создания класса — name, bases, attrs, а потом __init__ с теми же параметрами и уже созданным классом.

>>> class Meta ( type ):
. pass
.
>>> Meta( 'A' , ( object ,), <>)

В начале метакласс Meta ищет метод __new__ у себя в словаре __dict__, не находит его там и начинает искать в __dict__ своих родительских классах (т.е. метаклассах, в данном случае type), т.е. происходит обычный поиск атрибута в классе. В результате исполнения __new__ с соответствующими параметрами получает новый класс, который потом инициализируется вызовом __init__ метода метакласса.

В совсем развернутом виде получается:

cls = type.__dict__['__new__'](Meta, 'A', (object,), <>)
type.__dict__['__init__'](cls, 'A', (object,), <>)

Или с помощью super

cls = super(Meta, Meta).__new__(Meta, 'A', (object,), <>)
super(Meta, Meta).__init__(cls, 'A', (object,), <>)

Стоит отметить, что в отличие от инстанцирования обычных объектов, используется не object.__new__ и object.__init__, а type.__new__ и type.__init__. У object.__new__ и type.__new__ разные сигнатуры, и object.__new__ возвращает обычный объект (regular object), а type.__new__ — объект типа (typeobject), т.е. класс.

Посмотрим, как это все работает на примере.

>>> class Meta ( type ):
. def __new__ (mcls, name, bases, attrs):
. print 'creating new class' , name
. return super (Meta, mcls) . __new__(mcls, name, bases, attrs)
. def __init__ (cls, name, bases, attrs):
. print 'initing new class' , name
.
.
>>> class A ( object ):
. __metaclass__ = Meta
.
creating new class A
initing new class A

Во время инстанцирования просто объекта, никаких надписей не выводится.

>>> a = A()
>>>

Кроме того, соответственно, во методах __new__ и __init__ метакласса можно менять все: имя, список суперклассов, атрибуты.

Конструктор в Python – это особый тип метода (функции), который используется для инициализации членов экземпляра класса.

В C ++ или Java конструктор имеет то же имя, что и его класс, в Python конструктор обрабатывается по-разному. Он используется для создания объекта.

Конструкторы бывают двух типов:

  1. Параметризованный конструктор
  2. Непараметрический конструктор

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

Создание конструктора на Python

В Python метод __init __() имитирует конструктор класса. Этот метод вызывается при создании экземпляра класса. Он принимает ключевое слово self в качестве первого аргумента, который позволяет получить доступ к атрибутам или методу класса.

Мы можем передать любое количество аргументов во время создания объекта класса, в зависимости от определения __init __(). В основном он используется для инициализации атрибутов класса. У каждого класса должен быть конструктор, даже если он просто полагается на конструктор по умолчанию.

Рассмотрим следующий пример для инициализации атрибутов класса Employee при работе с конструкторами в Python.

Подсчет количества объектов класса

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

Непараметрический

Непараметрический конструктор используется, когда мы не хотим манипулировать значением, или конструктором, который имеет только self в качестве аргумента. Разберем на примере.

Параметризованный конструктор Python

У параметризованного конструктора есть несколько параметров вместе с самим собой.

Конструктор Python по умолчанию

Когда мы не включаем конструктор в класс или забываем его объявить, он становится конструктором по умолчанию. Он не выполняет никаких задач, а инициализирует объекты. Рассмотрим пример.

Более одного конструктора в одном классе

Давайте посмотрим на другой сценарий, что произойдет, если мы объявим два одинаковых конструктора в классе.

В приведенном выше коде объект st вызвал второй конструктор, тогда как оба имеют одинаковую конфигурацию. Первый метод недоступен для объекта st. Внутренне объект класса всегда будет вызывать последний конструктор, если у класса есть несколько конструкторов.

Примечание. Перегрузка конструктора в Python запрещена.

Встроенные функции классов Python

Встроенные функции, определенные в классе, описаны в следующей таблице.

SN Функция Описание
1 getattr(obj,name,default) Используется для доступа к атрибуту объекта.
2 setattr(obj, name,value) Она используется для установки определенного значения для определенного атрибута объекта.
3 delattr (obj, name) Необходима для удаления определенного атрибута.
4 hasattr (obj, name) Возвращает истину, если объект содержит определенный атрибут.

Встроенные атрибуты класса

Наряду с другими атрибутами класс Python также содержит некоторые встроенные атрибуты класса, которые предоставляют информацию о классе.

В этой статье мы познакомим вас с матрицей Python. Каждую операцию матрицы мы будем реализовывать с помощью кода.

Что такое матрица в Python?

Матрица в Python – это прямоугольный двумерный массив, в котором данные хранятся в строках и столбцах. Матрица может хранить данные любого типа, такие как числа, строки, выражения и т. д. Мы должны ознакомиться с основными концепциями матрицы перед ее использованием.

Данные расположены по горизонтали, называемые строками, а по вертикали – столбцами. Количество элементов внутри матрицы равно (R) X (C), где R – строки, а C – столбцы. Python не имеет встроенного типа для матриц, поэтому мы будем использовать несколько списков в качестве матриц.

Мы изучим следующие операции, которые применяются к матрицам:

  • сложение матриц;
  • матричное вычитание;
  • умножение матриц;
  • скалярное произведение;
  • векторное произведение;
  • и многие другие операции.

Работа матриц

Приведенная ниже матрица имеет размер 2×2, что означает, что у нее две строки и два столбца.

Создание матрицы в Python

Мы можем создать матрицу на Python, используя вложенный список. Все элементы заключаются в квадратные скобки ([]) и разделяются запятой. Посмотрим на следующие примеры:

  • Мы создали матрицу 3×3, используя вложенный список.
  • Первая строка содержит [‘Arun’, 25, 90, 74] в форме списка.
  • Вторая строка содержит список [‘Sachin’, 410, 87.50, 130].
  • Третья содержит [56, «Абхинай», 253, 471] в виде списка.
  • Мы замечаем, что наша матрица состоит из чисел, а также строкового значения.

Чтение матричных данных

Прочитаем каждую строку определенной матрицы.

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

В приведенном выше коде мы создали матрицу и получили длину матрицы. Мы повторили каждую строку, используя цикл for, и напечатали результат. Можно прочитать любую строку или столбец, используя вышеуказанный метод.

Давайте разберемся со следующей работой матрицы.

Добавление двух матриц

Мы добавим две матрицы и, используя вложенный цикл for, пройдемся по заданным матрицам.

  • Первая и вторая матрицы – 3×3.
  • Мы инициализировали еще одну матрицу mat3, в которой будет храниться равнодействующая матрица.
  • Применили вложенный цикл for для перебора матриц, внешний цикл перебирает первую матрицу.
  • Управление передается во внутренний цикл; затем переходит ко второму внутреннему циклу, здесь значение i равно нулю, и k также равно нулю.
  • В первой итерации первые элементы mat1 и mat2, добавленные друг к другу, будет продолжаться до тех пор, пока не будут добавлены все элементы.

Умножение двух матриц

Умножение двух матриц такое же, как в приведенном выше коде, только нужно изменить оператор + на *.

Транспонирование матрицы

Транспонирование – это операция, при которой строка данной матрицы преобразуется в столбец и наоборот. Рассмотрим на примере.

В приведенном выше коде у нас есть два цикла for для перебора каждой строки и каждого столбца. Как мы видим, в приведенном выше выводе мы присвоили mat1 [i] [j] и res [j] [k].

Транспонирование с помощью списка

Мы можем использовать значение списка, чтобы транспонировать матрицу с одной строкой кода.

Результат такой же, как и выше. Значение списка сократило количество строк кода и транспонировало матрицу.

Получение матричного ввода от пользователя

До сих пор мы обсуждали предварительно определенные матрицы. Но что, если пользователь хочет ввести свои данные. Итак, разберем следующий пример пользовательской матрицы.

В приведенном выше коде мы взяли данные пользователя, чтобы ввести количество строк и столбцов. Мы ввели 3 строки и 3 столбца; это означает, что в матрице будет 9 элементов. В цикле for элементы вставляются в пустую матрицу с помощью функции append(). Второй цикл for используется для печати входных данных в матричном формате.

Использование функции NumPy и map()

Python предоставляет внешнюю библиотеку NumPy. Она используется для научных вычислений; мы изучим NumPy с матрицей в разделе ниже и используем ее для матрицы пользовательского ввода.

Пример: Создание матрицы с использованием библиотеки NumPy

Библиотека NumPy помогает нам работать с массивом. Чтобы работать с NumPy, нам нужно установить ее, используя следующую команду.

После успешной установки мы должны импортировать ее в нашу программу.

Давайте разберемся в следующем примере.

Работа с матрицей с помощью NumPy

Мы можем выполнять все операции с матрицей, используя numpy.array(), такие как сложение, вычитание, транспонирование, нарезание матрицы и т. д.

Добавление матрицы

Мы создадим две матрицы с помощью функции numpy.array() и добавим их с помощью оператора +. Давайте разберемся в следующем примере.

Умножение

Мы будем использовать метод numpy.dot() для умножения обеих матриц. Это точечное умножение матриц mat1 и mat2, обрабатывает 2D-массив и выполняет умножение.

Нарезка элементов

Мы можем разрезать элемент матрицы, как в стандартном списке Python. Нарезка возвращает элемент на основе индекса начала / конца. Мы также можем сделать отрицательную нарезку. Синтаксис приведен ниже.

Arr представляет имя матрицы. По умолчанию начальный индекс равен 0, например – [: 3], это означает, что начальный индекс равен 0. Если мы не предоставим конечное значение, он будет учитывать длину массива. Мы можем передавать отрицательные значения индекса как в начало, так и в конец. В следующем примере мы применим нарезку в обычном массиве, чтобы понять, как она работает.

Теперь мы реализуем нарезку по матрице. Для выполнения следуйте синтаксису ниже.

Mat1 [row_start: row_end, col_start: col_end]

В приведенном выше синтаксисе:

  • Первое начало / конец представляет строки, которые означают выбор строк матрицы.
  • Первое начало / конец представляет столбцы, которые означают выбор столбца матрицы.

Мы будем выполнять нарезку в приведенной ниже матрице.

Вышеупомянутая матрица состоит из четырех строк. В 0-м ряду есть [4, 10, 60, 18, 20], в 1-й строке – [35, 16, 19, -12, 41] и так далее. В нем пять столбцов. Рассмотрим на примере.

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

Пример – печать первой строки и всех столбцов:

Пример – печать строк матрицы:

Заключение

До сих пор мы обсуждали базовую матрицу с использованием Python. Матрица Python – это специализированный двумерный прямоугольный список данных. Она может состоять из чисел, строк, выражения, символов и т. д. Python не предоставляет прямого способа реализации матричного типа данных. Мы можем создать матрицу, используя вложенный список и библиотеку NumPy.

Я привык писать на C++, и та задача, решение которой я собираюсь здесь продемонстрировать, сначала была мной решена на C++. Однако Python позволяет решить её с помощью намного более короткой программы (думаю, ряд других популярных языков в этом плане не хуже, но речь сейчас не о них). Это первая запись в моём блоге с использованием Python. Шапочное знакомство с этим языком у меня состоялось много лет назад, но пользоваться им не доводилось. Недавно я решил использовать его на занятиях, в первую очередь, из-за пакета модулей SciPy. В качестве первой задачки для себя я взял задачу, для которой достаточно стандартной функциональности.

Задача. Дана строка, содержащая формулу химического вещества. Требуется найти массу молекулы этого вещества в атомных единицах массы. Формула может содержать названия элементов вида K (одна заглавная латинская буква) или Mg (заглавная + строчная буква), круглые скобки (химики также используют и квадратные скобки, но упростим задачу), натуральные числа (количества атомов и групп атомов). Пример: «Ca (OH)2» (пробелы должны игнорироваться), масса равна сумме масс Ca и удвоенной суммы масс O и H.

Исходные данные: словарь (или файл) с массами элементов.

Первая идея была парсить формулу «руками» подряд, пропуская пробельные символы, выявляя названия элементов и числа, а скобочные формы обрабатывая рекурсивно. Подобная программа на C++ (с комментариями, циклом чтения в main и функцией чтения файла с массами элементов) вылилась примерно в 200 строк кода.

Вторая идея была использовать регулярное выражение для выявления частей формулы. Стандартная библиотека C++ включает поддержку регулярных выражений.

Дальше всё примерно так же, как при выделении лексем «руками». Такой вариант стал короче почти вдвое, но обзавёлся и важным недостатком — ошибки игнорировались, например, формула «N aHCO3» проходила, как если бы было написано «NHCO3», что неприятно.

Python позволяет записать то же самое ещё короче, но в нём есть возможность ещё сверх того ужать программу, не прибегая при этом к сторонним библиотекам. Причём, если в формуле есть ошибки, то мы это увидим. Впрочем, для начала я приведу вариант на основе предыдущего регэкспа, но уже с отловом ошибок (однако без чтения файла и main). Предполагается, что массы элементов заданы в словаре elements, скажем, так:

Итак, код парсера, используещего методы findall и split:

Ну, а теперь, «коронный номер». В Python есть встроенная функция eval, вычисляющая значение выражения (программы) на Python… Преобразуем-ка формулу в выражение, в духе ‘Ca(OH)2’ → ‘Ca+(O+H)*2’ и вычислим его! Для этого можно использовать метод регэкспа sub (подстановка по образцу). Далее привожу полученный код:

Это всего 20 строк. Если в формуле есть ошибки, о них сообщит сам парсер Python’а. Да, eval нельзя использовать в некоторых случаях, например, из соображений безопасности, но если это скрипт для личного пользования «по-быстрому», то это может быть очень удобно.

Addendum. Я использовал предварительную поддержку C++17 (g++ 7.2), и меня неприятно удивило отсутствие многих очевидных функций для работы со string_view. Например, его нельзя передать в конструктор fstream или в функцию stoi. Да, всегда можно явно сконвертировать в объект string, но это противоречит цели использования string_view: избежать создания лишних строк.

Александр Миков

Не слышал ни от одного физхимика, что программирование не нужно, мне кажется это настолько естественно в их сфере, что такое просто нереально услышать.

Тимур Маджидов


Тимур Маджидов

🤣

Александр, ты просто не был в провинции

Артем Сильверстов

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена
Машинное обучение, AI, нейронные сети, Big Data

Создаем нейронную сеть

📝

Description: Эта книга представляет собой введение в теорию и практику создания нейронных сетей. Она предназначена для тех, кто хочет узнать, что такое нейронные сети, где они применяются и как самому создать такую сеть, не имея опыта работы в данной области. Автор простым и понятным языком объясняет теоретические аспекты, знание которых необходимо для понимания принципов функционирования нейронных сетей и написания соответствующих программных инструкций. Изложение материала сопровождается подробным описанием процедуры поэтапного создания полностью функционального кода, который реализует нейронную сеть на языке Python и способен выполняться даже на таком миниатюрном компьютере, как Raspberry Pi Zero.

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена
Машинное обучение, AI, нейронные сети, Big Data

​Best-of-ML-Python – проект, который содержит список «потрясающих» библиотек для машинного обучения на Python

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

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена
Машинное обучение, AI, нейронные сети, Big Data

3 Python Packages That Make Data Science Simple

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Сегодня будет доклад на Сберлоге Тимофея Рыко «Как писать код для Data и просто Science ХОРОШО? Общие принципы, Python и Jupyter Notebooks»

⌚

Пятница 20 мая, 19.00 по Москве
Показать полностью.

Доклад ориентирован на начинающих, однако может быть полезен профи, особенно для тех, кто пришел из биологии. Как сделать код читаемым и зачем это делать? Какие есть подводные камни в Python? Как использовать преимущества Python и Jupyter разумно? Приходите, чтобы узнать ответы на эти и другие вопросы :)

Андрей Мартынович

Тимур Маджидов


Тимур Маджидов

Михаил Волков


Михаил Волков

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Бесплатный курс по Python для новичков

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

In Docker we trust

Docker сейчас - основная технология контейнеризации. Она позволяет завернуть свое приложение, которое может иметь множество зависимостей, ссылок на какие-то другие приложения, куски кода на bash и т.п. - в один контейнер. Если вы будете кому-то другому эту вашу разработку отдавать - с ума сойдете объяснять, как все устанавливать и настраивать.
Показать полностью. И почти наверняка человек где-то ошибется и вам придется начинать все сначала и искать у него ошибки. Ну или непредвиденные ситуации типа системных настроек, переменных окружения и т.п. Но вы можете ваше приложение завернуть в контейнер и отдавать последний - и человеку нужно использовать уже готовый контейнер, в котором внутри все зависимости уже установлены и настроены.

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

Никита Довидченко

Тимур Маджидов


Тимур Маджидов

Никита Довидченко

👍🏻

Тимур, пожалуйста!

Наталья Киреева

Полезная вещь для случаев, когда программный пакет не ставится по причине больших расхождений в версиях файлов или невозможности его в принципе поставить в системе без сложностей (типа tensorflow и FreeBSD). Во всех остальных случаях, не нужен.

Наталья Киреева

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена
Теоретическая химия

Python for computational chemistry - beginners tutorials - Introduction

Кирилл Щербаков


Кирилл Щербаков

👍🏿

Годнота

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Наступило время машинного обучения для биологии!
Конспект в трёх частях. Часть три.

Machine learning for biology part three | Python for Biologists

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Наступило время машинного обучения для биологии!
Конспект в трёх частях. Часть два.

Machine learning for biology part two | Python for Biologists

Илья Лобанов

Если честно, то машинное обучение всегда было архаизмом. Способом научить машину делать так как делают другие. Матлогика всегда многократно быстрее и эффективнее.

Тимур Маджидов


Тимур Маджидов

😂

Илья,

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Наступило время машинного обучения для биологии!
Конспект в трёх частях. Часть один.

Machine learning for biology part one | Python for Biologists

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

О машинном обучении - просто

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

ChemicalX: глубокое обучение для предсказания синергизма молекул лекарств

GitHub - AstraZeneca/chemicalx: A PyTorch and TorchDrug based deep learning library for drug pair sc

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

В жизни однажды наступает тот момент, когда надо посмотреть то самое десятичасовое видео.

😂

П.С. от редактора. В этот момент могу только посочувствовать

Julius Novachrono


Julius Novachrono

😋

Индусы

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Про нейронки ну совсем на пальцах

Машинное обучение, AI, нейронные сети, Big Data

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Удобные утилиты на RDKit

😊

Тут недавно Пэт Уолтерс решил выложить свой набор утилит, которые с использованием RDKit делают всякие полезные штуки: считают дескрипторы и сразу заворачивают в numpy, ищут фрагменты, центр молекулы и т.п.. Они не дополняют возможности RDKit, а просто упрощают использование или делают какие-то настройки - ничего выдающегося, но жизнь облегчается.
Показать полностью. Основная идея - запихнуть стандартные операции в один метод/функцию, чтоб каждый раз не ковыряться в мануале. Например, метод rd_shut_the_hell_up() делает RDKit менее "болтливым"

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Программка для визуализации структур молекул в графиках на plotly

Программка объединяется с plotly и с помощью RDKit позволяет при наведении на точки увидеть структуры молекул. Выглядит весьма удобно для проведения анализа данных или результатов - посмотрите картинку. Мои коллеги делали такую штуку, но по-моему не положили в открытый доступ, а проблем в создании такой визуализации много. Так что штука полезная однозначно.

Геннадий Лапа

😒

Это не программа, а код, который ещё надо встраивать в по?

Тимур Маджидов


Тимур Маджидов

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

"Кто со SMARTSами работал, тот в цирке не смеется". Но это шутка. На самом деле, SMARTS очень удобный способ задания запросов для подструктурного поиска, но в нем много всяких нюансов и читать его порой нужно очень внимательно, а составлять аккуратно. Но на самом деле, это основной способ задания запросов и фрагментов. Поэтому уважающий себя хемоинформатик должен знать SMARTS.
Показать полностью.

А еще давайте по приколу - напишите самый ужасный SMARTS, который вам удалось видеть?

Кирилл Ярцев


Кирилл Ярцев

А у вас в примере смартса не должно в начале квадратной скобки * стоять? А то окружение прописано, а самого атома нет.

Тимур Маджидов


Тимур Маджидов

Анатолий Красновский

Катерина Буракова

😅

С опытом задротсва в Pokémon go страх длинных и сложных поисковых строк исчезает

Хемоинформатика и Молекулярное Моделирование

Хемоинформатика и Молекулярное Моделирование запись закреплена

Визуализация химического пространства

В общем, вариантов много, назначений у карт может быть много - только фантазия может ограничить. Но имей в виду:
- на карты, получаемые некоторыми методами, нельзя положить новые объекты (которые не были при построении карты). То есть нудно добавить новые объекты - перестраивай карту с нуля. Например, MDS, SM, t-SNE или графы соседства. Их нельзя использовать для предсказаний свойств новых объектов.
- очень мало методов, которые можно использовать на больших данных.
- карты как методы предсказания свойств работают обычно хуже методов на основе обучения с учителем. Что не удивительно, поскольку это методы обучения без учителя, на основе всех дескрипторов, однако какие-то дескрипторы могут быть неинформативными или ненужными - это влияет.
- методы, где считаются расстояния между объектами (MDS, SM, в меньшей степени t-SNE), подвержены проклятью размерности и лучше очень много дескрипторов не использовать для них. РСА и ICA - не подвержены совсем, но только они линейные и имеют тенденцию группировать все в центре карты.

Читайте также: