Уменьшение выборки путем добавления n ^ dim элементов вместе в numpy / sparse - PullRequest
0 голосов
/ 22 марта 2019

для личного проекта. Я пытаюсь уменьшить трехмерную сетку, представленную в виде массива sparse.COO, с изображением, подобным данным (Индекс кодирует пространственную информацию, значение кодирует массу).

Насколько я знаю,sparse охватывает наиболее важные части API Numpy, поэтому в дальнейшем я буду использовать Numpy в качестве примера.К сожалению, некоторые Frameworks не очень хорошо обрабатывают массивы со многими ненулевыми записями.

Я попытался написать функцию, которая суммирует блок из 2 ^ 3 = 8 элементов вместе, основываясь на этом вопросе NumPy: сумма всех n столбцов матрицы , но моя версия не работаетThe Indeces:

sparray = np.arange(10*10*10).reshape(10,10,10)

#number of entries to sum in every direction, 2 for only neighbours
num_entries = 2

#the last 3 axis of the reshaped array
axis = tuple(range(-sparray.ndim,0))

downsampled_array = sparray.reshape(
    tuple(
        [int(s/num_entries) for s in sparray.shape]+[num_entries]*sparray.ndim
    )
).sum(axis=axis)

Пример 2d Пример:

sparray = np.arange(4*4).reshape(4,4)
>>>array(
  [[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15]])

axis = tuple(range(-sparray.ndim,0))
>>>(-2, -1)

#This is what the code does:
>>>array(
  [[ 6, 22],
   [38, 54]])

#should do:
array(
[[10, 19],
 [42, 50]]
)

заранее спасибо, вероятно, это действительно глупая ошибка.

1 Ответ

0 голосов
/ 22 марта 2019

решаемая.Нужно чередовать дополнительные измерения:

def downsample(sparray: sparse.COO, block_size: int):
    if any(x%block_size != 0 for x in sparray.shape):
        return IndexError('One of the Array dimensions is not divisible by the block_size')

    axis = tuple(range(1, 2 * sparray.ndim + 1, 2))
    shape = tuple(index for s in sparray.shape for index in (int(s/block_size), block_size))
    return sparray.reshape(shape).sum(axis=axis)
...