Возможно, что модуль Numpys ma
(для Masked Array) делает то, что вы хотите:
x = np.ma.array([[1, 3, 0, 0, 0, 0],
[0, 2, 3, 4, 0, 0]],
dtype=np.int,
mask=[[0, 0, 1, 1, 1, 1],
[0, 0, 0, 0, 1, 1]]) # True is "masked out"
В Cython вы бы разбили его на данные и маску
def y(x):
cdef int[:,::1] x_data = x.data
cdef int8_t[:,::1] x_mask = x.mask.view(dtype=np.int8)
Я рассматривал это как int8
, поскольку Cython плохо справляется с dtype=np.bool
.
Вы также можете подумать о создании собственных структур данных - например, это выглядит такэто всегда конец строки, равный None
, так что вы можете создать двумерный массив размером int
с и длиной строки одномерного массива (одномерный массив int
с).Затем вы проигнорируете что-либо, кроме длины строки.
Вероятно, стоит подчеркнуть, почему вы не можете хранить None
в массиве int
- чтобы получить скорость и эффективность использования пространстваиспользуя массив int
, Numpy выделяет только место, необходимое для хранения чисел.Для хранения None
потребуется выделить немного дополнительного пространства для каждого числа, чтобы сказать «на самом деле это другой тип», и для каждой операции иметь перед ним проверку на «действительно ли это число - число?».Как вы можете себе представить, это быстро становится неэффективным.