2015-05-07 2 views
3

Я пытаюсь перевести фрагмент кода Matlab в Python. Однако я не очень уверен, как правильно реализовать функцию sprand().Эквивалентность Matlab sprand() в Python?

Это как использование кода Matlab sprand():

% n_z is an integer, n_dw is a matrix 
n_p_z_dw = cell(n_z, 1); % n(d,w) * p(z|d,w) 
for z = 1:n_z 
    n_p_z_dw{z} = sprand(n_dw); 

И это, как я реализовать выше логики в Python:

n_p_z_dw = [None]*n_z # n(d,w) * p(z|d,w) 
density = np.count_nonzero(n_dw)/float(n_dw.size) 
for i in range(0, n_z): 
    n_p_z_dw[i] = scipy.sparse.rand(n_d, n_w, density=density) 

Это похоже на работу, но я не очень уверен, об этом. Любой комментарий или предложение?

+0

Я уверен, что они разные. 'sprand (S)' дает равномерно распределенные случайные числа с той же структурой разреженности, что и S. scipy.sparse.rand (a, b, плотность = плотность) 'имеет случайные числа, имеющие плотность плотности, эквивалентную' sprand (а, б, плотность) '. – cge

+0

@cge Да, я знаю это, так что это лучшее, что я могу сделать, чтобы имитировать sprand(). Поэтому я все еще ищу лучший способ реализовать 'sprand (S)' –

ответ

4

Следующая должна быть относительно быстрый способ, я думаю, для разреженного массива A:

import scipy.sparse as sparse 
import numpy as np 
sparse.coo_matrix((np.random.rand(A.nnz),A.nonzero()),shape=A.shape) 

Это будет строить формат COO разреженную матрицу: он использует A.nonzero() как координаты, и A.nnz (число ненулевых записей в A), чтобы найти число случайных чисел для генерации.


Интересно, хотя, может ли это быть полезным дополнением к функции scipy.sparse.rand.

Смежные вопросы