【发布时间】:2014-05-06 17:05:48
【问题描述】:
我正在尝试将这三个数组合并到下面的数组中。基本上相当于 SQL 外连接(其中 'pos' 字段是键/索引)
a1 = array([('2:6506', 4.6725971801473496e-25, 0.99999999995088695),
('2:6601', 2.2452745388799898e-27, 0.99999999995270605),
('2:21801', 1.9849650921836601e-31, 0.99999999997999001),],
dtype=[('pos', '|S100'), ('col1', '<f8'), ('col2', '<f8')])
a2 = array([('3:6506', 4.6725971801473496e-25, 0.99999999995088695),
('3:6601', 2.2452745388799898e-27, 0.99999999995270605),
('3:21801', 1.9849650921836601e-31, 0.99999999997999001),],
dtype=[('pos', '|S100'), ('col1', '<f8'), ('col2', '<f8')])
a3 = array([('2:6506', 4.6725971801473496e-25, 0.99999999995088695),
('2:6601', 2.2452745388799898e-27, 0.99999999995270605),
('2:21801', 1.9849650921836601e-31, 0.99999999997999001),],
dtype=[('pos', '|S100'), ('col3', '<f8'), ('col4', '<f8')])
想要的结果:
array([('2:6506', 4.6725971801473496e-25, 0.99999999995088695, 4.6725971801473496e-25, 0.99999999995088695),
('2:6601', 2.2452745388799898e-27, 0.99999999995270605, 2.2452745388799898e-27, 0.99999999995270605),
('2:21801', 1.9849650921836601e-31, 0.99999999997999001, 1.9849650921836601e-31, 0.99999999997999001),
('3:6506', 4.6725971801473496e-25, 0.99999999995088695, NaN, NaN),
('3:6601', 2.2452745388799898e-27, 0.99999999995270605, NaN, NaN),
('3:21801', 1.9849650921836601e-31, 0.99999999997999001, NaN, NaN),
],
dtype=[('pos', '|S100'), ('col1', '<f8'), ('col2', '<f8'), ('col3', '<f8'), ('col4', '<f8')])
我认为this answer 可能是在正确的轨道上,我只是不太明白如何应用它。
更新:
我尝试运行 unutbu 的答案,但出现此错误:
Traceback (most recent call last):
File "fail2.py", line 21, in <module>
a4 = recfunctions.join_by('pos', a4, a, jointype='outer')
File "/usr/local/msg/lib/python2.6/site-packages/numpy/lib/recfunctions.py", line 973, in join_by
current = output[f]
File "/usr/local/msg/lib/python2.6/site-packages/numpy/ma/core.py", line 2943, in __getitem__
dout = ndarray.__getitem__(_data, indx)
ValueError: field named col12 not found.
更新 2
我只在 numpy 1.5.1 上遇到此错误。我升级到 1.8.1 后它消失了。
【问题讨论】:
-
你会发布每个数组的 dtypes 吗?
-
嗯,我刚刚从你的答案中运行了代码。那不是指定dtypes吗?或者你认为后来有什么东西改变了他们?