NumPy中用SQL join还是R的merge()函数?
有没有一种方法可以根据键把两个数组合并在一起?顺便问一下,存储键的标准方式是把它放在NumPy的某一列里吗?因为NumPy没有'id'或者'rownames'这样的属性。
2 个回答
1
如果你在连接的关键字段中有重复值,建议使用 pandas.merge
而不是 recfunctions
。根据文档(正如 #joris 提到的,http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html):
在
r1
和r2
中,关键字段key
不能有重复值:如果有重复值,输出的结果会很不可靠。请注意,算法不会检查重复值。
在我的情况下,我确实需要重复的关键字段。我想比较每一列的行与其他所有列的行,包括在内(或者换个说法,就像数据库的人一样,我想要一个没有 on 或 where 条件的 内连接)。换句话说,如果用循环来表达,大概是这样的:
for i in a:
for j in a:
print(i, j, i*j)
这种操作在数据挖掘中是很常见的。
18
如果你只想用numpy,可以使用结构化数组和lib.recfunctions.join_by
这个函数(具体可以查看这个链接)。这里有个简单的例子:
In [1]: import numpy as np
...: import numpy.lib.recfunctions as rfn
...: a = np.array([(1, 10.), (2, 20.), (3, 30.)], dtype=[('id', int), ('A', float)])
...: b = np.array([(2, 200.), (3, 300.), (4, 400.)], dtype=[('id', int), ('B', float)])
In [2]: rfn.join_by('id', a, b, jointype='inner', usemask=False)
Out[2]:
array([(2, 20.0, 200.0), (3, 30.0, 300.0)],
dtype=[('id', '<i4'), ('A', '<f8'), ('B', '<f8')])
另外一个选择是使用pandas(可以参考文档)。我对它没有太多经验,但它提供了比标准numpy更强大的数据结构和功能,可以让处理“关系型”或“带标签”的数据变得简单直观。而且它确实有合并和连接的功能(比如可以看看这个链接)。