Scipy редкие массивы …?

Так, я делаю некоторую классификацию Kmeans с помощью numpy массивы, которые являются довольно разреженными - партии и много из обнуляют. Я полагал, что буду использовать 'редкий' пакет scipy для сокращения устройства хранения данных наверху, но я немного смущен тем, как создать массивы, не матрицы.

Я прошел это учебное руководство о том, как создать разреженные матрицы: http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7

Для имитации массива я просто создаю 1xN матрица, но как можно предположить, Asp.dot(Bsp) не вполне работает, потому что Вы не можете умножиться два 1xN матрицы. Я должен был бы транспонировать каждый массив к Nx1, и это является довольно хромым, так как я сделал бы его для каждого вычисления скалярного произведения.

Затем я пытался создать матрицу NxN, где столбец 1 == строка 1 (таким образом, что можно умножить две матрицы и просто подать верхний левый угловой как скалярное произведение), но который оказался действительно неэффективным.

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

Совет?

48
задан Alex Riley 6 June 2015 в 20:31
поделиться

2 ответа

Я не уверен, что это действительно намного лучше или быстрее, но вы можете сделать это, чтобы избежать использования транспонирования:

Asp.multiply(Bsp).sum()

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

Однако, вероятно, проще просто транспонировать их:

Asp*Bsp.T

Это не кажется таким уж сложным, но вы также можете создать подкласс и изменить метод mul().

1
ответ дан 26 November 2019 в 19:05
поделиться

Вы можете создать подкласс одного из существующих двумерных разреженных массивов

from scipy.sparse import dok_matrix

class sparse1d(dok_matrix):
    def __init__(self, v):
        dok_matrix.__init__(self, (v,))
    def dot(self, other):
        return dok_matrix.dot(self, other.transpose())[0,0]

a=sparse1d((1,2,3))
b=sparse1d((4,5,6))
print a.dot(b)
1
ответ дан 26 November 2019 в 19:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: