TypeError: объект типа 'numpy.float64' не имеет len () при назначении элемента матрицы - PullRequest
0 голосов
/ 06 июня 2019

У меня были проблемы с пакетом, использующим скудные разреженные матрицы.

Когда я изолировал проблему, я увидел, что ошибка возникает, когда я просто назначаю элемент матрице csr или csc.

from scipy.sparse import csr_matrix
x = csr_matrix(np.eye(10))
x[0,3] = int(4)

Я получаю ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-36-2e1809373207> in <module>
----> 1 x[0,3] = int(4)

~/anaconda2/envs/macrophage/lib/python3.6/site-packages/scipy/sparse/_index.py in __setitem__(self, key, x)
     67             if x.size != 1:
     68                 raise ValueError('Trying to assign a sequence to an item')
---> 69             self._set_intXint(row, col, x.flat[0])
     70             return
     71 

~/anaconda2/envs/macrophage/lib/python3.6/site-packages/scipy/sparse/compressed.py in _set_intXint(self, row, col, x)
    795     def _set_intXint(self, row, col, x):
    796         i, j = self._swap((row, col))
--> 797         self._set_many(i, j, x)
    798 
    799     def _set_arrayXarray(self, row, col, x):

~/anaconda2/envs/macrophage/lib/python3.6/site-packages/anndata/h5py/h5sparse.py in _set_many(self, i, j, x)
    176     i, j, M, N = self._prepare_indices(i, j)
    177 
--> 178     n_samples = len(x)
    179     offsets = np.empty(n_samples, dtype=self.indices.dtype)
    180     ret = _sparsetools.csr_sample_offsets(M, N, self.indptr, self.indices,

TypeError: object of type 'numpy.float64' has no len()

Кажется, что функция _set_many () ожидает несколько значений, а setitem () ожидает только одно!Как я могу исправить эту ошибку?

Для справки я использую scipy 1.3.0.

Спасибо.

1 Ответ

0 голосов
/ 06 июня 2019

С только scipy.sparse ваш пример кода работает:

In [246]: x=sparse.csr_matrix(np.eye(10))                                                              
In [247]: x[0,3]=int(4)                                                                                
/usr/local/lib/python3.6/dist-packages/scipy/sparse/_index.py:69: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive. lil_matrix is more efficient.
  self._set_intXint(row, col, x.flat[0])
In [248]: x                                                                                            
Out[248]: 
<10x10 sparse matrix of type '<class 'numpy.float64'>'
    with 11 stored elements in Compressed Sparse Row format>
In [249]: x.A                                                                                          
Out[249]: 
array([[1., 0., 0., 4., 0., 0., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

Но traceback

~/anaconda2/envs/macrophage/lib/python3.6/site-packages/anndata/h5py/h5sparse.py in _set_many(self, i, j, x)

ссылается на другой пакет, https://anndata.readthedocs.io/en/stable/,, который имеет h5py/h5sparse модуль.В некотором смысле это изменяет поведение стандартной матрицы sparse.

Стандарт _set_manyscipy.sparse.compressed.py) сначала превращает x в массив np.array(x...) и использует nsample = x.size.

В сумме:

  • вы не сообщили нам о пакете anndata
  • «ошибка» в этом пакете или вашиспользовать его.
...