Результаты верны, вы просто читаете их неправильно. Каждое число в первой строке представляет первый индекс результата. Вторая строка представляет второй индекс. Так,
(array([0, 0, 0, 0]),
array([0, 0, 0, 0]),
array([0, 0, 1, 1]),
array([0, 1, 0, 1]))
соответствует точкам в обр. [0,0,0,0], обр. [0,0,0,1] и т. Д.
Вы, вероятно, были бы менее смущены, если бы результат не был квадратной формы. Попробуйте, например, это:
np.where(arr==0)
(array([0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int64),
array([1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1], dtype=int64),
array([0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], dtype=int64),
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=int64))
Как видите, строки не могут соответствовать местоположению одной единицы.