Python 'numpy.float64' object cannot be interpreted as an integer

Есть вот такой вот скрипт, для разделения массива на кластеры.

from scipy import ndimage
import numpy as np
list_coord = [[-2, -6, 281], [1, 1, 1], [2, 1, 1], [12, 11, 11],
              [1, 2, 2], [7, 6, 6], [13, 12, 12],
              [11, 13, 13], [6, 6, 6], [6, 7, 7], [8, 8, 8]]
list_coord_a=np.array(list_coord)
map_a=list_coord_a[:,:2]
min_value=np.min(map_a, axis=0) #коррекция для отрицательных координат
map_a=map_a-min_value
image=np.zeros(np.max(map_a, axis=0)+1, dtype=np.int32)
image[map_a[:,0], map_a[:,1]]=1
label, n=ndimage.label(image, structure=np.ones((3,3)))
for i in range(1,n+1):
    print(f'Компонент {i}: \n {np.argwhere(label==i)+min_value}')

Изменил тип элементов массива с int на float и получаю вот такую ошибку

image = np.zeros(np.max(map_a, axis=0) + 1 , dtype=np.float64)
TypeError: 'numpy.float64' object cannot be interpreted as an integer

Не могу понять как её исправить, может кто подсказать?


Ответы (1 шт):

Автор решения: CrazyElf

Ваш код у меня успешно работает без всяких ошибок. Но я всё-таки смог добиться такой же ошибки как у вас и в той же строке. Ошибка там возникает только если сделать map_a массивом с числами c плавающей точкой:

list_coord_a=np.array(list_coord, dtype=np.float64)
map_a=list_coord_a[:,:2]
...
---> 10 image = np.zeros(np.max(map_a, axis=0)+1, dtype=np.int32)
TypeError: 'numpy.float64' object cannot be interpreted as an integer

Дело в том, что первый параметр у np.zeros - это shape, т.е. размеры создаваемой матрицы с нулями. Как вы себе представляете матрицу с дробным размером? Вот и numpy её не представляет. Ну, он бы мог, наверное, округлить, но не знает куда - вверх или вниз. А у самого np.zeros вы, конечно, можете ставить любой dtype, это не приводит ни к какой ошибке - нули могут быть любого типа, хоть комплексного, это не проблема вообще.

→ Ссылка