Изменить размер numpy массива с большим количеством измерений - PullRequest
1 голос
/ 05 августа 2020

Я использую Python 3.7.7. Я пытаюсь изменить размер массива Numpy изображений с помощью этой функции:

def resize_image_array(image_array, rows_standard, cols_standard):

    # image_array.shape = (3929, 2, 256, 256, 1)
    # rows_standard = 200
    # cols_standard = 200

    # Height or row number.
    image_rows_Dataset = np.shape(image_array)[2]
    # Width or column number.
    image_cols_Dataset = np.shape(image_array)[3]

    num_rows_1 = ((image_rows_Dataset // 2) - (rows_standard / 2)) # num_rows_1 = 28.0
    num_rows_2 = ((image_rows_Dataset // 2) + (rows_standard / 2)) # num_rows_2 = 228.0
    num_cols_1 = ((image_cols_Dataset // 2) - (cols_standard / 2)) # num_cols_1 = 28.0
    num_cols_2 = ((image_cols_Dataset // 2) + (cols_standard / 2)) # num_cols_2 = 228.0

    return image_array[..., num_rows_1:num_rows_2, num_cols_1:num_cols_2, :]

Но в последнем операторе я получаю эту ошибку:

TypeError: slice indices must be integers or None or have an __index__ method

Я также пробовал:

return image_array[:, :, num_rows_1:num_rows_2, num_cols_1:num_cols_2, :]

Но с той же ошибкой, что и выше.

Как исправить эту ошибку?

1 Ответ

1 голос
/ 05 августа 2020

Проблема, как упоминалось в комментариях, заключается в том, что использование истинного деления (/) на ванильных python скалярах возвращает float, даже если оба операнда являются целыми числами. Оператор не проверяет целочисленную делимость перед выполнением деления. float s не имеют метода __index__, который преобразует int-подобные количества в фактические int.

Простое решение - заменить / на //. Однако вычисление num_rows_2 и num_cols_2 кажется излишним. Если вам известны значения rows_standard и cols_standard, которые вам нужны, просто добавьте их к num_rows_1 и num_cols_1 соответственно. Это приведет к гораздо более надежному выражению:

row_start = (image_array.shape[2] - rows_standard) // 2
row_end = row_start + rows_standard
col_start = (image_array.shape[3] - cols_standard) // 2
col_end = col_start + cols_standard
image_array[..., row_start:row_end, col_start:col_end, :]
...