Переместить уникальные значения в разные измерения - PullRequest
0 голосов
/ 21 марта 2020

У меня есть требование, когда я хочу преобразовать 2D-матрицу в 3D, разделив 3 уникальных значения по 3 измерениям. Например: преобразовать

A = [1  2  3  3
     1  1  2  1
     3  2  2  3
     1  3  3  2]

в

A = [[1  0  0  0
      1  1  0  1
      0  0  0  0
      1  0  0  0]

     [0  1  0  0
      0  0  1  0
      0  1  1  0
      0  0  0  1]

     [0  0  1  1
      0  0  0  0
      1  0  0  1
      0  1  1  0]]

Простите, если синтаксис матричного представления неверен.

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Вы можете использовать np.unique, использовать логические массивы и приводить их к int, используя numpy.ndarray.astype.

import numpy as np
a=np.array([[1, 2, 3, 3], [1, 1, 2, 1], [3, 2, 2, 3], [1, 3, 3, 2]])

[a==i.astype(int) for i in np.unique(a)]

Выход :

[array([[1, 0, 0, 0],
        [1, 1, 0, 1],
        [0, 0, 0, 0],
        [1, 0, 0, 0]]), 
 array([[0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 1, 1, 0],
        [0, 0, 0, 1]]), 
 array([[0, 0, 1, 1],
        [0, 0, 0, 0],
        [1, 0, 0, 1],
        [0, 1, 1, 0]])]
2 голосов
/ 21 марта 2020

Используйте broadcasting с outer-equality для векторизованного решения -

# Input array
In [8]: A
Out[8]: 
array([[1, 2, 3, 3],
       [1, 1, 2, 1],
       [3, 2, 2, 3],
       [1, 3, 3, 2]])

In [11]: np.equal.outer(np.unique(A),A).view('i1')
Out[11]: 
array([[[1, 0, 0, 0],
        [1, 1, 0, 1],
        [0, 0, 0, 0],
        [1, 0, 0, 0]],

       [[0, 1, 0, 0],
        [0, 0, 1, 0],
        [0, 1, 1, 0],
        [0, 0, 0, 1]],

       [[0, 0, 1, 1],
        [0, 0, 0, 0],
        [1, 0, 0, 1],
        [0, 1, 1, 0]]], dtype=int8)

Чтобы использовать явное dimension-extension + comparison, это будет:

(A == np.unique(A)[:,None,None]).view('i1')
0 голосов
/ 21 марта 2020

РЕДАКТИРОВАТЬ: Ch3steR ответ лучше

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

unique_values = np.unique(A)

B = np.array([np.zeros_like(A) for i in range(len(unique_values))])

for idx, value in enumerate(unique_values):
    B[idx][A == value] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...