ndarray array python multidimensional-array matrix numpy

array - La multiplicación de matriz para matrices dispersas en Python



numpy.ndarray to array (1)

¿Has mirado a scipy.sparse ? No tiene sentido reinventar la rueda, aquí. Las matrículas dispersas son algo bastante estándar.

(En el ejemplo, estoy usando una matriz de 300000x4 para imprimir más fácilmente después de la multiplicación. Sin 300000x1000 matriz de 300000x1000 no debería ser ningún problema. Esto será mucho más rápido que multiplicar dos matrices densas, suponiendo que tienes una mayoría de 0 elementos .)

import scipy.sparse import numpy as np # Make the result reproducible... np.random.seed(1977) def generate_random_sparse_array(nrows, ncols, numdense): """Generate a random sparse array with -1 or 1 in the non-zero portions""" i = np.random.randint(0, nrows-1, numdense) j = np.random.randint(0, ncols-1, numdense) data = np.random.random(numdense) data[data <= 0.5] = -1 data[data > 0.5] = 1 ij = np.vstack((i,j)) return scipy.sparse.coo_matrix((data, ij), shape=(nrows, ncols)) A = generate_random_sparse_array(4, 300000, 1000) B = generate_random_sparse_array(300000, 5, 1000) C = A * B print C.todense()

Esto produce:

[[ 0. 1. 0. 0. 0.] [ 0. 2. -1. 0. 0.] [ 1. -1. 0. 0. 0.] [ 0. 0. 0. 0. 0.]]

Quiero multiplicar una matriz dispersa A, con una matriz B que tiene 0, -1 o 1 como elementos. Para reducir la complejidad de la multiplicación de la matriz, puedo ignorar los ítems si son 0, o continuar y agregar la columna sin multiplicación si el ítem es 1 o subs. si es -1. La discusión sobre esto está aquí:

Algoritmo de proyección aleatorio pseudo código

Ahora puedo continuar e implementar este truco, pero me pregunto si usaré las funciones de multiplicación de Numpy, será más rápido.

¿Alguien sabe si optimizaron la multiplicación de matrices para tales matrices? O puede sugerir algo para acelerar este proceso ya que tengo una matriz de 300000x1000.