Как получить оригинальную комбинацию массива numpy? - PullRequest
0 голосов
/ 24 июня 2019

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

x = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

y= np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
       [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

x = np.expand_dims(x, 1)
combos = (x + y).reshape(-1, 12).astype("int")
mask = np.any(np.equal(combos, 0), axis=1)
combos=combos[~mask]
print("combos:",combos)

# Prints
combos: [[1 1 1 2 2 2 2 2 1 1 1 1]
 [1 1 1 1 2 2 2 2 2 1 1 1]
 [1 1 1 2 2 2 2 2 2 1 1 1]
 [1 1 1 2 2 2 2 2 2 1 1 1]]

Теперь из приведенного выше результата мне нужно знать, каковы значения строк x и y, которые создали комбо, например для первой строки:

Комбинации [0] = [1,1,1,2,2,2,2,2,1,1,1,1]

X = [1,1,1,1,1,1,1,1,0,0,0,0]

Y = [0,0,0,1,1,1,1,1,1,1,1,1]

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

Может помочь, если (x+y) не сплющено.Затем маска показывает значение True, для которого индексы x и y генерируют ненулевые строки.

import numpy as np
x = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
              [0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
              [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0],
              [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
              [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
              [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
y= np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],
             [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0],
             [0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
             [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]])

x = np.expand_dims(x, 1)
temp = x + y

Создает маску, индексы x, y которой полностью ненулевые.

mask = ~np.any(temp == 0, axis=2)
mask
Out[8]:
array([[False, False, False,  True],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [ True, False, False, False],
       [False, False, False,  True],
       [False, False, False, False],
       [False, False, False, False],
       [ True, False, False, False]])

x_ix = np.indices((x.shape[0], y.shape[0]))[0, mask]
x_ix
Out[12]: array([0, 4, 5, 8])

y_ix = np.indices((x.shape[0], y.shape[0]))[1, mask]
y_ix
Out[13]: array([3, 0, 3, 0])

x_ixи массивы y_ix идентифицируют комбинации индексов, которые дают требуемые результаты.

Это может не дать именно то, что вам нужно, но может указывать на решение.

0 голосов
/ 24 июня 2019

Несмотря на то, что вы можете попытаться восстановить комбинации из сумм, заметить комбинации и суммировать их, безусловно, лучше. Вместо

x = np.expand_dims(x, 1)
combos = (x + y).reshape(-1, 12).astype("int")
mask = np.any(np.equal(combos, 0), axis=1)
combos=combos[~mask]
print("combos:",combos)

Вы можете попробовать что-то вроде этого:

combos=dict()
for e in x:
    for f in y:
        combo=e+f
        tp=tuple(combo)
        if 0 in tp:
            continue
        if tp not in combos:
            combos[tp]=set()
        combos[tp].add((tuple(e),tuple(f)))
for e in combos:
    print(e)
    for f in combos[e]:
        print("->{}{}".format(f[0],f[1]))

(Полученный словарь имеет суммы в качестве ключей и наборы комбинаций в качестве значений, все в виде кортежей. Конечно, вы также можете хранить индексы x и y, используемые вместо этого для экономии места, и я настоятельно рекомендую это делать.)

...