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

2024-09-30 12:15:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个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]

X=[1,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]


Tags: 代码numpy信息npanymask数组equal
2条回答

虽然你可以尝试从和中重建组合,但在总结组合的同时记下它们肯定更好。而不是

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

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

这也许不能给出你所需要的,但可能指向一个解决方案。你知道吗

相关问题 更多 >

    热门问题