You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Было бы удобно иметь в пакете dtype который можно использовать при конструкции numpy массивов и для других пакетов поддерживающих dtype типизацию.
В моем случае я хотел создать разреженную матрицу в scipy для хранения интервалов. Но тот же scipy не поддерживает стандартный python объект как dtype (так как разреженные матрицы могут быть очень большими у них применяются различные техники для сжатия данных, реализация таких техник в контексте ванильного питон объекта невозможна)
Здравствуйте, @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)
Здравствуйте, да основная задумка 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% уверенностью сказать что это решит проблемы
@realkarmakun
Спасибо большое за комментарий и ссылки! :)
Мне надо немного времени, чтобы прочитать их и детальней разобраться в вопросе. После чего я вернусь к Вам с обратной связью.
@realkarmakun , добрый день!
Извиняюсь за долгий ответ.
В целом, с помощью scipy.sparse.coo_matrix можно работать с разреженными массивами, где некоторые элементы могут быть объектами. Вот пример:
importnumpyasnpimportintvalpyasipip.precision.extendedPrecisionQ=Falsetest=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
Примечание: в них реализованы направленные огругления при выполнении арифметических операциях.
Жаль, но я отошел от использования dtype, так что этого достаточно (пришлось раскладывать данные на чанки матриц) Но все равно спасибо за ответ. Спасибо за прекрасную библиотеку! Думаю тикет можно закрыть
Activity
AndrosovAS commentedon Jan 10, 2024
Здравствуйте, @realkarmakun !
Я согласен, что сейчас нельзя создать разреженную матрицу через scipy, что крайне неудобно. Например, это не позволяет использовать из других пакетов уже реализованные методы машинного обучения, где в данных есть интервалы.
Если мы рассматриваем интервальную матрицу, то это будет класс ArrayInterval у которого есть атрибут _data. Этот атрибут является массивом np.array([], dtype=object) состоящим из элементов ClassicalArithmetic или KaucherArithmetic. Каждый из классов полностью описывает интервал из определённой арифметики, т.е. хранят его нижний и верхний конец. Поскольку каждый элемент массива является собственным классом, то тип массива object.
Таким образом, с помощью numpy реализованы векторные вычисления с использованием интервалов.
Если я правильно понимаю, то scipy.sparse работает исключительно с объектами np.array([], dtype=float / int).
Пожалуйста, можете более подробно рассказать, как с помощью типизации можно решить эту проблему?
Вот небольшой пример самой проблемы.
С уважением,
Ваш разработчик
realkarmakun commentedon 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 commentedon Jan 12, 2024
@realkarmakun
Спасибо большое за комментарий и ссылки! :)
Мне надо немного времени, чтобы прочитать их и детальней разобраться в вопросе. После чего я вернусь к Вам с обратной связью.
С уважением,
Ваш разработчик
AndrosovAS commentedon Feb 4, 2024
@realkarmakun , добрый день!
Извиняюсь за долгий ответ.
В целом, с помощью scipy.sparse.coo_matrix можно работать с разреженными массивами, где некоторые элементы могут быть объектами. Вот пример:
Для того, чтобы внутренние функции intvalpy также работали - их надо изменить, как и интервальные классы.
К сожалению, этот процесс будет совсем не быстрым в силу моей занятости...
Также я вижу, что некоторые полезные операции не работают. Пример:
К сожалению, мне не известны другие библиотеки для интервальных вычислений на Python, которые бы позволяли создавать разреженные матрицы. Поэтому, пока что ничего лучше кроме этого "костыльного" способа я Вам предложить не могу.
Ещё раз спасибо за наводку!
P.S.
На всякий случай вот другие интервальные библиотеки: pyinterval, pyibex
Примечание: в них реализованы направленные огругления при выполнении арифметических операциях.
realkarmakun commentedon Feb 25, 2024
Жаль, но я отошел от использования dtype, так что этого достаточно (пришлось раскладывать данные на чанки матриц) Но все равно спасибо за ответ. Спасибо за прекрасную библиотеку! Думаю тикет можно закрыть