Получение ненулевых данных и позиций из 2D-массива в Python - PullRequest
2 голосов
/ 14 февраля 2020

У меня есть двумерный массив, и я надеюсь, что смогу получить все ненулевые данные и их положение. Но теперь я просто могу получить ненулевую позицию данных.

Есть ли способ получить значение и позицию одновременно?

import numpy as np

groupMatrix = np.array([
[1, 1, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 2],
[3, 3, 0, 2]
])

res = zip(*np.nonzero(groupMatrix))

print(list(res))

Результат, который я получил является [(0, 0), (0, 1), (1, 0), (2, 3), (3, 0), (3, 1), (3, 3)]

Но я надеюсь, что результат может показать позицию со значением.

Например, (x, y, z): x, y представляют позицию, а z представляет значение в точке.

(0, 0, 1), (0, 1 , 1), (1, 0, 1), (2, 3, 2), (3, 0, 3), (3, 1, 3), (3, 3, 2).

Спасибо за помощь !!!

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Используйте np.vstack и numpy многомерное индексирование.

i   = np.nonzero(arr)

res = np.vstack([i, arr[i]])

array([[0, 0, 1, 2, 3, 3, 3],
       [0, 1, 0, 3, 0, 1, 3],
       [1, 1, 1, 2, 3, 3, 2]])

Если вы действительно нужен список кортежей с информацией, вы можете использовать list(zip(*...))

>>> list(zip(*res))
[(0, 0, 1), (0, 1, 1), (1, 0, 1), (2, 3, 2), (3, 0, 3), (3, 1, 3), (3, 3, 2)]
2 голосов
/ 14 февраля 2020

Если ваши массивы маленькие, как в вашем вопросе, ndenumerate будет читаемым и быстрым. Если ваши массивы большие, вы должны по умолчанию использовать векторизованные методы.


[(*i, j) for i, j in np.ndenumerate(arr) if j != 0]

[(0, 0, 1), (0, 1, 1), (1, 0, 1), (2, 3, 2), (3, 0, 3), (3, 1, 3), (3, 3, 2)]
2 голосов
/ 14 февраля 2020
print(list(zip(*np.nonzero(groupMatrix),groupMatrix[groupMatrix!=0])))

Это, конечно, не самое эффективное решение (оно повторяет поиск ненулевых элементов), но оно прекрасно работает.

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