Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
realkarmakun opened this issue Jan 10, 2024 · 5 comments
Open

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

realkarmakun opened this issue Jan 10, 2024 · 5 comments

Comments

@realkarmakun
Copy link

realkarmakun commented Jan 10, 2024

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

@AndrosovAS
Copy link
Owner

AndrosovAS commented Jan 10, 2024

Здравствуйте, @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)

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

@realkarmakun
Copy link
Author

realkarmakun commented Jan 11, 2024

Здравствуйте, да основная задумка 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% уверенностью сказать что это решит проблемы

@AndrosovAS
Copy link
Owner

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

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

@AndrosovAS
Copy link
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
Примечание: в них реализованы направленные огругления при выполнении арифметических операциях.

@realkarmakun
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants