Я получил (нормализованную) разреженную матрицу смежности и список меток для соответствующих строк матрицы. Поскольку некоторые узлы были удалены другой функцией санитизации, в матрице есть несколько строк, содержащих NaN. Я хочу найти эти строки и удалить их , а также их соответствующих лейблов. Вот функция, я писал:Удалите ряды nan в scipy разреженной матрице
def sanitize_nan_rows(adj, labels):
# convert to numpy array and keep dimension
adj = np.array(adj, ndmin=2)
for i, row in enumerate(adj):
# check if row all nans
if np.all(np.isnan(row)):
# print("Removing nan row label in %s" % i)
# remove row index from labels
del labels[i]
# remove all nan rows
adj = adj[~np.all(np.isnan(adj), axis=1)]
# return sanitized adj and labels_clean
return adj, labels
labels
простой список Python и adj
имеет тип <class 'scipy.sparse.lil.lil_matrix'>
(содержащий элементы типа <class 'numpy.float64'>
), которые одновременно являются результатом
adj, labels = nx.attr_sparse_matrix(infected, normalized=True)
На исполнение I получите следующую ошибку:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-503-8a404b58eaa9> in <module>()
----> 1 adj, labels = sanitize_nans(adj, labels)
<ipython-input-502-ead99efec677> in sanitize_nans(adj, labels)
6 for i, row in enumerate(adj):
7 # check if row all nans
----> 8 if np.all(np.isnan(row)):
9 print("Removing nan row label in %s" % i)
10 # remove row index from labels
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
Так что я думал, что SciPy NaNs отличаются от numpy NaNs. После этого я попытался преобразовать разреженную матрицу в массив numpy (рискуя затопить мою RAM, потому что матрица имеет около 40k строк и столбцов). При его запуске ошибка остается прежней. Кажется, что np.array()
вызова просто обернута разреженная матрица и не превратить ее, как type(row)
внутри цикл по-прежнему выводит <class 'scipy.sparse.lil.lil_matrix'>
Так что мой вопрос заключается в том, чтобы решить эту проблему, и есть ли лучший подход, который получает Работа выполнена. Я довольно новичок в numpy и scipy (как используется в networkx), поэтому я буду благодарен за объяснение. Спасибо!
EDIT: После изменения преобразования к тому, что hpaulj предложил, я получаю MemoryError:
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-519-8a404b58eaa9> in <module>()
----> 1 adj, labels = sanitize_nans(adj, labels)
<ipython-input-518-44201f4ff35c> in sanitize_nans(adj, labels)
1 def sanitize_nans(adj, labels):
----> 2 adj = adj.toarray()
3
4 for i, row in enumerate(adj):
5 # check if row all nans
/usr/lib/python3/dist-packages/scipy/sparse/lil.py in toarray(self, order, out)
348 def toarray(self, order=None, out=None):
349 """See the docstring for `spmatrix.toarray`."""
--> 350 d = self._process_toarray_args(order, out)
351 for i, row in enumerate(self.rows):
352 for pos, j in enumerate(row):
/usr/lib/python3/dist-packages/scipy/sparse/base.py in_process_toarray_args(self, order, out)
697 return out
698 else:
--> 699 return np.zeros(self.shape, dtype=self.dtype, order=order)
700
701
MemoryError:
Так, по-видимому, мне придется придерживаться разреженной матрицы для сохранения памяти.
Редкая матрица не является плотным массивом. Посмотрите на 'adj.data' и' adj.rows'. Для матрицы 'lil' это массивы объектов списка, одна пара подсписок для каждой строки массива. – hpaulj
'adj.A' или' adj.toarray() 'производит массив – hpaulj
Спасибо за ваш быстрый ответ! Я отредактировал вопрос в соответствии с вашими предложенными изменениями и моими результатами. (Я просто изменил строку преобразования на 'adj = adj.toarray()') – dmuhs