Несовместимое ненулевое значение: разреженные и плотные массивы pandasPython

Программы на Python
Anonymous
Несовместимое ненулевое значение: разреженные и плотные массивы pandas

Сообщение Anonymous »

Оригинал
Насколько я понимаю, разреженные и плотные матрицы хранят одну и ту же информацию, но в разном внутреннем формате. У меня есть разреженная матрица, состоящая в основном из значений False:
(Pdb) x
[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, ...]
Fill: False
IntIndex
Indices: array([ 73004, 73005, 73007, ..., 2629273, 2629274, 2629275],
dtype=int32)

Проверка ненулевых значений аналогична представлению выше:
(Pdb) x.nonzero()
(array([ 73004, 73005, 73007, ..., 2629273, 2629274, 2629275],
dtype=int32),)

Здесь я вижу нечто неожиданное:
(Pdb) x[73004]
False

Более неожиданные результаты:
(Pdb) y = x.to_dense()
(Pdb) y.nonzero()
(array([ 456646, 658112, 692257, ..., 2608127, 2608154, 2608292]),)

Очевидно, что разреженные и плотные массивы отличаются не только внутренним образом, поскольку вы не получите одно и то же после обхода туда и обратно:
(Pdb) z = pd.arrays.SparseArray(x.to_dense())
(Pdb) z
[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, ...]
Fill: False
IntIndex
Indices: array([ 456646, 658112, 692257, ..., 2608127, 2608154, 2608292],
dtype=int32)

Что мне здесь не хватает?
Изменить
Следующее, вероятно, не является минимальным, но оно служит для воспроизведения разреженного массива, аналогичного x выше:
import pandas as pd

sa = pd.arrays.SparseArray([1,-1,2,1,-2,4], fill_value=-2, dtype=float)
as_int = pd.DataFrame(sa)[0].apply(int)
x = ((as_int > 0) & (as_int & 1) > 0).values

Что я вижу:
(Pdb) print(f"{pd.__version__}: {x.nonzero()}")
1.1.5: (array([0, 1, 2, 3, 5], dtype=int32),)

Я не могу воспроизвести изображение в новой версии панд. В версии 2.2.3 строка, выдающая x, приводит к следующему предупреждению:
FutureWarning: Allowing arbitrary scalar fill_value in SparseDtype is deprecated. In a future version, the fill_value must be a valid value for the SparseDtype.subtype.

>>> print(f"{pd.__version__}: {x.nonzero()}")
2.2.3: (array([0, 3], dtype=int32),)

В версии 3.0.2 строка, которая выводит x, выдает ошибку:
ValueError: fill_value must be a valid value for the SparseDtype.subtype

Вернуться в «Python»