Сначала получите степени 10 для каждого числа в массиве с
powers = np.floor(np.log10(a))
В вашем примере это дает нам
array([[ 0., 0., 0., -1.],
[-3., -2., 0., -4.],
[ 0., -3., 0., 0.],
[ 0., 0., -2., -3.]])
Теперь, если мы разделим i
-ый элемент в массиве с помощью 10**power_i
мы по существу перемещаем каждый ненулевой элемент в массиве на первую позицию. Теперь мы можем просто взять слово, чтобы удалить другие ненулевые цифры, а затем умножить результат на 10**power_i
, чтобы вернуться к исходной шкале.
Полное решение - это только код ниже
powers = np.floor(np.log10(a))
10**powers * np.floor(a/10**powers)
А как насчет чисел, больших или равных 10?
Для этого вы можете просто взять np.floor
исходного значения в массиве. Мы можем сделать это легко с помощью маски. Вы можете изменить ответ, как показано ниже
powers = np.floor(np.log10(a))
result = 10**powers * np.floor(a/10**powers)
mask = a >= 10
result[mask] = np.floor(a[mask])
Вы также можете использовать маску, чтобы избежать вычисления степеней и логарифма для чисел, которые будут заменены позже.