【问题标题】:comparing two numpy arrays and adding same rows比较两个numpy数组并添加相同的行
【发布时间】:2016-04-25 17:47:46
【问题描述】:

我有两个大数据文件,一个有两列,一个有三列。我想从第二个文件中选择第一个数组中包含的所有行。我的想法是比较 numpy 数组。

假设我有:

a = np.array([[1, 2, 3], [3, 4, 5],  [1, 4, 6]])

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

结果应该是这样的:

[[1, 2, 3], [3, 4, 5]]

对此有何建议?

编辑: 所以最终这行得通。不是很方便,但很管用。

for ii in range(a.shape[0]):
    u, v, w = a[ii,:]
    for jj in range(b.shape[0]):
        if (u == b[jj, 0] and v == b[jj, 1]):
            print [u, v, w]

【问题讨论】:

    标签: arrays python-2.7 numpy


    【解决方案1】:

    numpy_indexed 包(免责声明:我是它的作者)包含有效解决此类问题的功能,无需使用任何 python 循环:

    import numpy_indexed as npi
    a[npi.contains(b, a[:, :2])]
    

    【讨论】:

      【解决方案2】:

      如果您不想使用其他库但只想在numpy 中执行此操作,您可以执行类似于herehere 的建议,即使用np.in1d(参见docs ) 它确实为您提供了一个掩码,指示一个一维数组中的元素是否存在于另一个一维数组中。顾名思义,这个函数只适用于一维数组。但是您可以使用结构化数组视图(使用np.view)欺骗numpy 以为您拥有一维数组。不过需要注意的是,您需要第一个数组a 的深层副本,因为np.view 不与切片混合,好吧。但是,如果这对您来说不是什么大问题,那么可以考虑以下内容:

      a_cp = a[:, :2].copy()
      a[np.in1d(a_cp.view((np.void, a_cp.dtype.itemsize*a_cp.shape[1])).ravel(),
                b.view((np.void, b.dtype.itemsize*b.shape[1])).ravel())]
      

      可能对你有用。

      这直接使用掩码数组从您的数组a 返回正确的值。

      【讨论】:

        【解决方案3】:

        检查一下,@Ernie。它可以帮助您找到解决方案。 ;D

        http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.in1d.html

        【讨论】:

        • 不赞成仅链接的答案,我实际上不确定 in1d 会有什么帮助。
        • 是的,这并没有真正的帮助,因为该函数只为一维数组定义..
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多