我有两个大型数据文件,一个有两列,一个有三列。我想从第二个文件中选择第一个数组中包含的所有行。我的想法是比较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]
答案 0 :(得分:2)
numpy_indexed包(免责声明:我是它的作者)包含有效解决此类问题的功能,而不使用任何python循环:
import numpy_indexed as npi
a[npi.contains(b, a[:, :2])]
答案 1 :(得分:0)
如果您不想使用其他库但希望仅在numpy
中执行此操作,则可以执行类似于建议here和here的操作,即使用{{ 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]])