当前位置: 首页 > 知识库问答 >
问题:

比较Python中的两个矩阵,并填充缺失的行

印飞捷
2023-03-14

我有两个特征矩阵,它们的行数不同。假设矩阵A比矩阵B有更多的行。矩阵的列包括ID1、ID2、时间片、特征值。由于B中有一段时间没有特征值,因此B中的行数小于A。我需要找到B中缺少的行。然后将具有相关ID1、ID2值的行添加到B中,并且特征为零。

            ID1  ID2 Time_slice Feature
A= array([[ 100,  1.,   0.,     1.5],
          [ 100,  1.,   1.,     3.7],
          [ 100,  2.,   0.,     1.2],
         [ 100,   2.,   1.,     1.8],
         [ 100,   2.,   2.,     2.9],
         [ 101,   3.,   0.,     1.5],
          [ 101,  3.,   1.,     3.7],
          [ 101,  4.,   0.,     1.2],
         [ 101,   4.,   1.,     1.8],
         [ 101,   4.,   2.,     2.9]])

B= array([[ 100,  1.,   0.,     1.25],
          [ 100,  1.,   1.,     3.37],
          [ 100,  2.,   0.,     1.42],
         [ 100,   2.,   1.,     1.68]])

Output should be as follow:

         [[ 100,  1.,   0.,     1.25],
          [ 100,  1.,   1.,     3.37],
          [ 100,  2.,   0.,     1.42],
         [ 100,   2.,   1.,     1.68],
         [ 100,   2.,   2.,     0  ],
         [ 101,   3.,   0.,     0],
          [ 101,  3.,   1.,     0],
          [ 101,  4.,   0.,     0],
         [ 101,   4.,   1.,     0],
         [ 101,   4.,   2.,     0]])

共有2个答案

汪德寿
2023-03-14

你可以尝试这样的方法:

import numpy as np

A = np.array([[ 100,  1.,   0.,     1.5],
          [ 100,  1.,   1.,     3.7],
          [ 100,  2.,   0.,     1.2],
          [ 100,  2.,   1.,     1.8],
          [ 100,  2.,   2.,     2.9],
          [ 101,  3.,   0.,     1.5],
          [ 101,  3.,   1.,     3.7],
          [ 101,  4.,   0.,     1.2],
          [ 101,  4.,   1.,     1.8],
          [ 101,  4.,   2.,     2.9]])

B = np.array([[ 100,  1.,   0.,     1.25],
          [ 100,  1.,   1.,     3.37],
          [ 100,  2.,   0.,     1.42],
          [ 100,  2.,   1.,     1.68]])

listB = B.tolist()

for rowA in A:
    if rowA.tolist not in listB:
        B = np.append(B, [[rowA[0], rowA[1], rowA[2], 0]], axis=0)

print B
周鸿云
2023-03-14

从所需的输出来看,如果前三列相等,则认为a中的一行与B中的一行匹配。如果我们能够确定哪些A行与B行匹配,您的问题将在很大程度上得到解决。

如果识别匹配仅仅依赖于单个列中的值,那么我们可以使用np。in1d。例如,如果[0,1,2,5,0]A中的值,[0,2]B中的值,则

In [39]: np.in1d([0, 1, 2, 5, 0], [0, 2])
Out[39]: array([ True, False,  True, False,  True], dtype=bool)

显示A的哪些行与B的行匹配。

在NumPy中(目前)没有该函数的高维推广。

然而,有一个技巧可以用来将2D数组的多列视为一列字节值——从而将2D数组转换为1D数组。然后我们可以将np.in1d应用到这个1D数组。我从Jaime那里学到的技巧,在这里封装在函数中:

import numpy as np

def asvoid(arr):
    """
    View the array as dtype np.void (bytes).

    This views the last axis of ND-arrays as np.void (bytes) so
    comparisons can be performed on the entire row.
    https://stackoverflow.com/a/16840350/190597 (Jaime, 2013-05)

    Some caveats:
        - `asvoid` will work for integer dtypes, but be careful if using asvoid on float
        dtypes, since float zeros may compare UNEQUALLY:
        >>> asvoid([-0.]) == asvoid([0.])
        array([False], dtype=bool)

        - `asvoid` works best on contiguous arrays. If the input is not contiguous,
        `asvoid` will copy the array to make it contiguous, which will slow down the
        performance.

    """
    arr = np.ascontiguousarray(arr)
    return arr.view(np.dtype((np.void, arr.dtype.itemsize * arr.shape[-1])))

A = np.array([[ 100,  1.,   0.,     1.5],
              [ 100,  1.,   1.,     3.7],
              [ 100,  2.,   0.,     1.2],
              [ 100,   2.,   1.,     1.8],
              [ 100,   2.,   2.,     2.9],
              [ 101,   3.,   0.,     1.5],
              [ 101,  3.,   1.,     3.7],
              [ 101,  4.,   0.,     1.2],
              [ 101,   4.,   1.,     1.8],
              [ 101,   4.,   2.,     2.9]])

B = np.array([[ 100,  1.,   0.,     1.25],
              [ 100,  1.,   1.,     3.37],
              [ 100,  2.,   0.,     1.42],
              [ 100,   2.,   1.,     1.68]])

mask = np.in1d(asvoid(A[:, :3]), asvoid(B[:, :3]))
result = A[~mask]
result[:, -1] = 0
result = np.row_stack([B, result])
print(result)    

产量

[[ 100.      1.      0.      1.25]
 [ 100.      1.      1.      3.37]
 [ 100.      2.      0.      1.42]
 [ 100.      2.      1.      1.68]
 [ 100.      2.      2.      0.  ]
 [ 101.      3.      0.      0.  ]
 [ 101.      3.      1.      0.  ]
 [ 101.      4.      0.      0.  ]
 [ 101.      4.      1.      0.  ]
 [ 101.      4.      2.      0.  ]]
 类似资料:
  • 问题内容: 是否可以从函数构造矩阵?在这种情况下,该函数特别是两个向量的绝对差:。一个使用常规python的最小工作示例: 给予: 有一个看起来像这样的构造会很好: 我可以在其中传递带有参数的输入函数,并保留numpy的速度优势。 问题答案: 我建议看看numpy的广播功能: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

  • 问题内容: 我有以下代码: 它创建一个填充零的矩阵。相反,我想知道是否有一种函数或方法可以将它们初始化为s,而方法很简单。 问题答案: 您很少需要在numpy中进行矢量操作循环。您可以创建一个未初始化的数组并立即分配给所有条目: 我已经在这里和Blaenk发布的时间安排了时间: 时序显示优先选择作为更快的替代方案。OTOH,我喜欢numpy的便捷实现,在该实现中您可以同时为整个slice分配值,代

  • 问题内容: 我有两个简单的表:(这里只有“ id”列) 表格1: 表2: sql查询应比较两个表中table2中缺少的“ id”并返回:1,2 有任何想法吗?:) TY 问题答案: 有几种方法可以给这只猫蒙皮: 或者,您可以使用左外部联接:

  • 我如何在一行中创建和初始化一个非常值的特征矩阵?下面是一个示例, 或

  • 我必须比较两个JSON数组,一个值为[“123.45”],另一个值为[“123.45”]如何迭代和删除空格?第二个数组值在实际值之前有空格。

  • 欢迎提供任何关于这个问题更准确标题的帮助。。 我有一个数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的物品。看起来像这样。 此数据集中的每个观察值都与一个独特的存储日组合有关,但每个存储日观察值都是以消耗的物品的正数为条件列出的,即