Обновление : Там есть функция numpy для этого:
Вы можете использовать numpy.ndenumerate
:
dst = np.array([[*reversed(x), y] for x, y in np.ndenumerate(src)])
print(dst)
#[[0 0 2]
# [1 0 1]
# [2 0 5]
# [3 0 2]
# [0 1 1]
# [1 1 4]
# [2 1 2]
# [3 1 1]
# [0 2 4]
# [1 2 5]
# [2 2 5]
# [3 2 7]
# [0 3 1]
# [1 3 5]
# [2 3 9]
# [3 3 3]]
ndenumerate
вернет итератор, выдающий пары координат и значений массива.Сначала вам нужно будет изменить координаты для желаемого результата.Далее распакуйте координаты в список 1 со значением и используйте понимание списка для использования итератора.
Исходный ответ
Вы можете попробовать:
dst = np.column_stack(zip(*[*reversed(np.indices(src.shape)), src])).T
print(dst)
#[[0 0 2]
# [1 0 1]
# [2 0 5]
# [3 0 2]
# [0 1 1]
# [1 1 4]
# [2 1 2]
# [3 1 1]
# [0 2 4]
# [1 2 5]
# [2 2 5]
# [3 2 7]
# [0 3 1]
# [1 3 5]
# [2 3 9]
# [3 3 3]]
Объяснение
Сначала используйте numpy.indices
, чтобы получитьмассив, представляющий индексы сетки в форме src
.
print(np.indices(src.shape))
#[[[0 0 0 0]
# [1 1 1 1]
# [2 2 2 2]
# [3 3 3 3]]
#
# [[0 1 2 3]
# [0 1 2 3]
# [0 1 2 3]
# [0 1 2 3]]]
Мы можем изменить их (так как это порядок, который вы хотите в вашем конечном выводе), и распаковать в список 1 , который также содержит src
.
Затем zip
все элементы этого списка, чтобы получить (col, row, val)
троек.Мы можем сложить их вместе, используя numpy.column_stack
.
list(zip(*[*reversed(np.indices(src.shape)), src]))
#[(array([0, 1, 2, 3]), array([0, 0, 0, 0]), array([2, 1, 5, 2])),
# (array([0, 1, 2, 3]), array([1, 1, 1, 1]), array([1, 4, 2, 1])),
# (array([0, 1, 2, 3]), array([2, 2, 2, 2]), array([4, 5, 5, 7])),
# (array([0, 1, 2, 3]), array([3, 3, 3, 3]), array([1, 5, 9, 3]))]
Наконец, транспонировать (numpy.ndarray.T
), чтобы получить окончательный результат.
Примечания :
- Распаковка в
list
доступна только в Python 3.5 +