如何获得numpy数组的原始组合?

时间:2019-06-24 14:14:00

标签: python python-3.x numpy numpy-ndarray

我有两个numpy数组,我可以通过添加这两个数组来获得所有组合,其中两个行都没有剩余零,但是这样做时,我松开了数组的原始组成部分,但不确定如何检索那条信息。请在下面查看我的代码:

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,1]

2 个答案:

答案 0 :(得分:0)

尽管您可以尝试从总和中重建组合,但在组合时记下组合绝对会更好。代替

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的索引以节省空间,我强烈建议这样做。) / p>

答案 1 :(得分:0)

如果(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数组标识产生所需结果的索引组合。

这可能无法完全满足您的需求,但可能会指出解决方案。