Skip to content

dtype для интервала #25

Open

Description

@realkarmakun

Было бы удобно иметь в пакете dtype который можно использовать при конструкции numpy массивов и для других пакетов поддерживающих dtype типизацию.
В моем случае я хотел создать разреженную матрицу в scipy для хранения интервалов. Но тот же scipy не поддерживает стандартный python объект как dtype (так как разреженные матрицы могут быть очень большими у них применяются различные техники для сжатия данных, реализация таких техник в контексте ванильного питон объекта невозможна)

Activity

  1. AndrosovAS commented on Jan 10, 2024

    @AndrosovAS
    Owner

    Здравствуйте, @realkarmakun !
    Я согласен, что сейчас нельзя создать разреженную матрицу через scipy, что крайне неудобно. Например, это не позволяет использовать из других пакетов уже реализованные методы машинного обучения, где в данных есть интервалы.

    Если мы рассматриваем интервальную матрицу, то это будет класс ArrayInterval у которого есть атрибут _data. Этот атрибут является массивом np.array([], dtype=object) состоящим из элементов ClassicalArithmetic или KaucherArithmetic. Каждый из классов полностью описывает интервал из определённой арифметики, т.е. хранят его нижний и верхний конец. Поскольку каждый элемент массива является собственным классом, то тип массива object.
    Таким образом, с помощью numpy реализованы векторные вычисления с использованием интервалов.

    Если я правильно понимаю, то scipy.sparse работает исключительно с объектами np.array([], dtype=float / int).
    Пожалуйста, можете более подробно рассказать, как с помощью типизации можно решить эту проблему?

    Вот небольшой пример самой проблемы.

    class MyInterval:
        
        def __init__(self, inf, sup):
            self.inf = inf
            self.sup = sup
            
    class ArrayIntervals:
        
        def __init__(self, intervals):
            self.data = intervals
    
    intervals = ArrayIntervals(np.array([MyInterval(a, b) for a, b in zip([1,2,3], [4,5,6])], dtype=object))
    sp.sparse.csc_matrix(intervals)
    

    С уважением,
    Ваш разработчик

  2. realkarmakun commented on Jan 11, 2024

    @realkarmakun
    Author

    Здравствуйте, да основная задумка dtype в репрезентации объекта как структуры на языке C с ограниченным размером. То есть это по сути отображение объекта python в C структуру для эффективного хранения. Я сам не очень разбираюсь в python, поэтому не могу помочь. Возможно я сам неправильно понимаю dtype и его функции но из того что узнал из документации numpy могу скажать следующее:
    Насколько мне известно scipy поддерживает любые dtype обозначенные в numpy (https://numpy.org/doc/stable/user/basics.types.html)

    Я предполагал что intvalpy мог бы поставлять уже созданный dtype который можно передавать как аргументы и к массивам scipy и numpy (у них вроде отлично сделанная интерполяция, ряд методов scipy возвращает numpy массивы).

    UPD: обнаружил следущую статью для использования как dtype композиции значений, думаю это как раз случай подходящий invalpy https://numpy.org/doc/stable/user/basics.rec.html#structured-arrays, но опять же python для меня лишь хобби, не могу со 100% уверенностью сказать что это решит проблемы

  3. AndrosovAS commented on Jan 12, 2024

    @AndrosovAS
    Owner

    @realkarmakun
    Спасибо большое за комментарий и ссылки! :)
    Мне надо немного времени, чтобы прочитать их и детальней разобраться в вопросе. После чего я вернусь к Вам с обратной связью.

    С уважением,
    Ваш разработчик

  4. AndrosovAS commented on Feb 4, 2024

    @AndrosovAS
    Owner

    @realkarmakun , добрый день!
    Извиняюсь за долгий ответ.

    В целом, с помощью scipy.sparse.coo_matrix можно работать с разреженными массивами, где некоторые элементы могут быть объектами. Вот пример:

    import numpy as np
    import intvalpy as ip
    ip.precision.extendedPrecisionQ = False
    
    test = np.eye(3, dtype=object)
    test[0, 1] = ip.Interval(5, 7)
    sparse = sp.sparse.coo_matrix(test)
    #<3x3 sparse matrix of type '<class 'numpy.object_'>'
    #with 4 stored elements in COOrdinate format>

    Для того, чтобы внутренние функции intvalpy также работали - их надо изменить, как и интервальные классы.
    К сожалению, этот процесс будет совсем не быстрым в силу моей занятости...
    Также я вижу, что некоторые полезные операции не работают. Пример:

    sparse @ sparse
    # TypeError: no supported conversion for types: (dtype('O'),)

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

    Ещё раз спасибо за наводку!

    P.S.
    На всякий случай вот другие интервальные библиотеки: pyinterval, pyibex
    Примечание: в них реализованы направленные огругления при выполнении арифметических операциях.

  5. realkarmakun commented on Feb 25, 2024

    @realkarmakun
    Author

    Жаль, но я отошел от использования dtype, так что этого достаточно (пришлось раскладывать данные на чанки матриц) Но все равно спасибо за ответ. Спасибо за прекрасную библиотеку! Думаю тикет можно закрыть

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions