比较两个numpy数组并添加相同的行

时间:2016-04-25 17:47:47

标签: arrays python-2.7 numpy

我有两个大型数据文件,一个有两列,一个有三列。我想从第二个文件中选择第一个数组中包含的所有行。我的想法是比较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]

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果您不想使用其他库但希望仅在numpy中执行此操作,则可以执行类似于建议herehere的操作,即使用{{ 1}}(参见docs)它提供了一个掩码,指示一个1D数组中的元素是否存在于另一个1D数组中。顾名思义,此功能仅适用于1D阵列。但您可以使用结构化数组视图(使用np.view)欺骗np.in1d以认为您有1D数组。但需要注意的是,您需要第一个数组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())] 返回正确的值。

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-1)

NumPy数组在这里并不是必需的,你可以改用列表:

>>> a = [[1, 2, 3], [3, 4, 5], [1, 4, 6]]
>>> b = [[1, 2], [3, 4]]
>>> [row for row in a if row[:2] in b]
[[1, 2, 3], [3, 4, 5]]

上述解决方案对于大型列表来说可能非常耗时。如果您有效率问题,我认为@Eelco答案将是首选。但是,如果你不想安装numpy_indexed(或者只是你不能),你会发现这段代码很有用:

>>> a = np.array([[1, 2, 3], [3, 4, 5], [1, 4, 6]])
>>> b = np.array([[1, 2], [3, 4]])
>>> b_set = set(map(tuple, b))
>>> b_set
set([(1, 2), (3, 4)])
>>> a[np.nonzero([tuple(row[:-1]) in b_set for row in a])]
array([[1, 2, 3],
       [3, 4, 5]])