Можно ли преобразовать dtype матрицы scipy CSR в NPY_FLOAT?

У меня есть матрица scipy CSR, которая была построена из матрицы COO следующим образом:

coord_mat = coo_matrix((data, (row, col)), dtype=np.float64)

Он используется в качестве входных данных для библиотеки с базовой реализацией C, и я считаю, что dtype моей матрицы — double(np.float64). Однако я сталкиваюсь со следующей ошибкой:

ValueError: Buffer dtype mismatch, expected 'flt' but got 'double'

Я провел небольшое исследование и нашел scipy C -api, который сообщил мне, что тип данных NPY_FLOAT преобразуется в 32-битное число с плавающей запятой в C, в то время как текущий тип данных, который у меня есть, соответствует 64-битному типу данных типа double. Я на правильном пути здесь? Если да, то как указать тип массива? Я не совсем уверен, как я могу вызвать объект NPY_FLOAT, чтобы его бросить.

Любая помощь по этому вопросу будет глубоко оценена!


person andre    schedule 21.09.2016    source источник


Ответы (1)


Я не уверен насчет интерфейса C, попробую объяснить часть coo_matrix.

Поскольку вы используете ввод кортежа, он разбивает его на 3 переменные

obj, (row, col) = arg1

затем он присваивает их атрибутам

self.row = np.array(row, copy=copy, dtype=idx_dtype)
self.col = np.array(col, copy=copy, dtype=idx_dtype)
self.data = np.array(obj, copy=copy)

и поскольку вы указали dtype

if dtype is not None:
   self.data = self.data.astype(dtype)

Если data, row и col уже являются массивами, для которых вы не указали dtype, разреженная матрица может использовать эти входные данные в качестве атрибутов без копирования. Ваш параметр dtype создаст копию.

Разреженная матрица — это не массив numpy, а скорее объект, который имеет 3 массива в качестве атрибута. Матрица принимает метод astype, который, вероятно, выполняет то же действие self.data.astype. Итак, я думаю, что ваш случай сводится к следующему: можете ли вы привести любой массив к этому типу.

person hpaulj    schedule 21.09.2016
comment
Спасибо за отзыв! Это именно та проблема, с которой я столкнулся, я подозреваю, что мне нужно привести массив к NPY_FLOAT dtype, чтобы обеспечить совместимость - увы, я не уверен, как это сделать, и я не могу найти документацию в Интернете, поэтому у меня нет ключ к тому, на правильном ли я пути или нет. - person andre; 22.09.2016