Вставить индекс массива в транспонированный массив - PullRequest
1 голос
/ 19 сентября 2019

Предположим, у меня есть массив:

[[2,1,5,2], 
 [1,4,2,1],
 [4,5,5,7],
 [1,5,9,3]]

Я пытаюсь преобразовать массив в форму (16, 3), где первые два элемента в результирующем массиве являются индексными числами, а последний -Значение.Например:

[[0, 0, 2], [1, 0, 1], [2, 0, 5], [3, 0, 2], [0, 1, 4], ....]

Возможно ли это с помощью функции numpy или аналогичной?Или я должен сделать это с моей собственной функцией?

Рабочий пример кода:

import numpy as np

src = np.array([[2,1,5,2],
                [1,4,2,1],
                [4,5,5,7],
                [1,5,9,3]])

dst = np.array([])


for x in range(src.shape[0]):
    for y in range(src.shape[1]):
        dst = np.append(dst, [[y, x, src[x][y]]])

print(dst.reshape(16,3))

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Я не знаю, есть ли для этого функция в numpy, но вы можете использовать списки, чтобы легко построить этот массив:

import numpy as np

src = np.array([[2,1,5,2],
                [1,4,2,1],
                [4,5,5,7],
                [1,5,9,3]])

dst = np.array([ [y, x, src[x][y]] 
                 for x in range(src.shape[0]) 
                 for y in range(src.shape[1])])

print(dst.reshape(16,3))

Надеюсь, это поможет.

0 голосов
/ 19 сентября 2019

Обновление : Там есть функция 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), чтобы получить окончательный результат.

Примечания :

  1. Распаковка в list доступна только в Python 3.5 +
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...