Так, я делаю некоторую классификацию Kmeans с помощью numpy массивы, которые являются довольно разреженными - партии и много из обнуляют. Я полагал, что буду использовать 'редкий' пакет scipy для сокращения устройства хранения данных наверху, но я немного смущен тем, как создать массивы, не матрицы.
Я прошел это учебное руководство о том, как создать разреженные матрицы: http://www.scipy.org/SciPy_Tutorial#head-c60163f2fd2bab79edd94be43682414f18b90df7
Для имитации массива я просто создаю 1xN матрица, но как можно предположить, Asp.dot(Bsp) не вполне работает, потому что Вы не можете умножиться два 1xN матрицы. Я должен был бы транспонировать каждый массив к Nx1, и это является довольно хромым, так как я сделал бы его для каждого вычисления скалярного произведения.
Затем я пытался создать матрицу NxN, где столбец 1 == строка 1 (таким образом, что можно умножить две матрицы и просто подать верхний левый угловой как скалярное произведение), но который оказался действительно неэффективным.
Я хотел бы использовать редкий пакет scipy в качестве волшебной замены для массива numpy (), но пока еще, я не действительно уверен, что сделать.
Совет?
Я не уверен, что это действительно намного лучше или быстрее, но вы можете сделать это, чтобы избежать использования транспонирования:
Asp.multiply(Bsp).sum()
Это просто берет поэлементное произведение двух матриц и суммирует продукты. Вы можете создать подкласс любого используемого вами формата матрицы, в котором в качестве точечного продукта будет использоваться вышеприведенное утверждение.
Однако, вероятно, проще просто транспонировать их:
Asp*Bsp.T
Это не кажется таким уж сложным, но вы также можете создать подкласс и изменить метод mul().
Вы можете создать подкласс одного из существующих двумерных разреженных массивов
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)