Итерация по массиву numpy за исключением того же элемента - PullRequest
2 голосов
/ 23 января 2020

У меня есть массив 2d numpy, и я хочу повторить его два раза. Идея состоит в том, чтобы выполнить операцию для каждой пары комбинаций массива, кроме самого себя, например:

enter image description here

Где B - numpy массив из 36 массив из 4 элементов, таких как

  [[  9.106593 279.82645  192.9962   381.61804 ]
   [  9.106593 279.82645  192.9962   381.61804 ]]

, а L - это элементы из 36 элементов массива, такие как:

  [1,2,.......,35]

Может кто-нибудь помочь мне найти немного элегантное решение numpy с использованием широковещания? Спасибо

1 Ответ

0 голосов
/ 23 января 2020

Я думаю, что ваш самый быстрый способ сделать это - выполнить операцию на всех парах, а затем распечатать только те результаты, которые вас интересуют. Я предполагаю, что операция так же проста, как и приведенный вами пример умножения.

Я приведу пример использования meshgrid для 1d массива и предоставлю вам возможность расширить до 2d.

a = np.array([1, 2, 3, 4]
print(a)
>>> array([1, 2, 3, 4])

x, y = np.meshgrid(a, a)
print(x)
>>> array([[1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4],
           [1, 2, 3, 4]])
print(y)
>>> array([[1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4]])

z = x*y
print(z)
>>> array([[ 1,  2,  3,  4],
           [ 2,  4,  6,  8],
           [ 3,  6,  9, 12],
           [ 4,  8, 12, 16]])

Теперь результаты, которые вы хотели игнорировать, расположены по диагонали, и вы можете печатать каждый элемент, опуская их следующим образом.

height, width = z.shape
for h in range(height):
    for w in range(width):
        if h == w:
            continue  # Skips this one.
        print(z[h][z])

Я не уверен, почему вы хотите сделать это дважды, так что, возможно, вам просто нужны два оператора печати или более сложный. Если вы можете прокомментировать это, я могу что-то предложить.

РЕДАКТИРОВАТЬ: я вижу, что вы добавили комментарий, который вам вообще не нужен для циклов. Вы можете просто напечатать все это с помощью print(z) и игнорировать значения, которые вам не интересны, или, если вы передаете значения чему-то другому, вы можете игнорировать их на этом этапе.

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