2016-09-20 2 views
0

Вот питон SSCCE:Python пустой csr_matrix бросает ValueError: не может вывести размеры от нулевого размера индексных массивов

import scipy.sparse 
data = [] 
row = [] 
col = [] 
csr = scipy.sparse.csr_matrix((data, (row, col))) #error happens here 
print(type(csr)) 
print(csr) 

Я бегу это с python2.7 я получаю сообщение об ошибке:

raise ValueError('cannot infer dimensions from zero sized index arrays') 
ValueError: cannot infer dimensions from zero sized index arrays 

Она работает правильно, когда я кормлю их значения, как это:

csr = scipy.sparse.csr_matrix(([10,20,30], ([0,0,0],[0,1,2]))) 

или как это:

csr = scipy.sparse.csr_matrix(([10,20], ([0,0],[0,1]))) 
csr = scipy.sparse.csr_matrix(([10], ([0],[0]))) 

Я прочитал документацию по адресу: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html и

http://docs.scipy.org/doc/scipy/reference/sparse.html#usage-information

но это, кажется, не объясняет, почему я не могу сделать Csr матрицу с нулевыми элементов в ней.

Что происходит с этой ошибкой? Я предполагаю, что типы scipy.sparse.csr.csr_matrix должны иметь по крайней мере одно значение в них при создании экземпляра? Это кажется глупым ограничением.

ответ

1

Scipy разреженные матрицы имеют определенную форму, например. (m, n), где m - количество строк, а n - количество столбцов. Когда вы пишете, например, csr_matrix(([1, 2], ([0, 3], [1, 4]))), csr_matrix отображает форму из максимальных значений индексов строк и столбцов. Но когда вы пишете csr_matrix(([], ([], []))), функция не имеет способа узнать, какова должна быть форма матрицы (и я думаю, что она не создаст матрицу с формой (0, 0) по умолчанию).

Один из способов справиться с этим, чтобы дать явные shape:

In [241]: csr_matrix(([], ([], [])), shape=(3, 3)) 
Out[241]: 
<3x3 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
+1

Действительно, вероятно, вы должны дать явную форму вместо того, чтобы позволить SciPy угадать, даже если массив не пуст. – user2357112

+0

Вы можете создать пустую csr_matrix следующим образом: 'csr = scipy.sparse.csr_matrix ((0, 0))'. Однако это не будет выводиться из пустого списка. Это вопрос, почему он должен сделать вывод, что что-то пошло не так, как мы хотим, чтобы мы не хотели никаких элементов? Ответ в том, что так оно и есть, справиться с этим. –

+0

Соответствующий код находится в 'coo_matrix .__ init__'. – hpaulj

0

Вы можете сделать пустую разреженную матрицу - из пустого плотного одного или, давая параметр формы:

In [477]: from scipy import sparse 
In [478]: sparse.csr_matrix([]) 
Out[478]: 
<1x0 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
In [479]: sparse.csr_matrix(([],([],[])),shape=(0,0)) 
Out[479]: 
<0x0 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 

Вы даже можете создать большой пустой номер с shape:

In [480]: sparse.csr_matrix(([],([],[])),shape=(1000,1000)) 
Out[480]: 
<1000x1000 sparse matrix of type '<class 'numpy.float64'>' 
    with 0 stored elements in Compressed Sparse Row format> 
In [481]: M=_ 
In [482]: M[34,334]=1000 
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient. 
    SparseEfficiencyWarning) 

Но, учитывая неэффективность вставки значений или конкатенирование новой матрицы, я не понимаю, почему вы хотите создать такое существо.

Соответствующий код из sparse.coo_matrix, когда первый аргумент является кортежем:

  try: 
       obj, (row, col) = arg1 
      except (TypeError, ValueError): 
       raise TypeError('invalid input format') 

      if shape is None: 
       if len(row) == 0 or len(col) == 0: 
        raise ValueError('cannot infer dimensions from zero ' 
            'sized index arrays') 
       M = np.max(row) + 1 
       N = np.max(col) + 1 
       self.shape = (M, N) 
Смежные вопросы