Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 752f9da

Browse files
committed
Fixing edge cases in rec_join in branch
svn path=/branches/v0_91_maint/; revision=5852
1 parent 4a5a4bb commit 752f9da

File tree

1 file changed

+12
-16
lines changed

1 file changed

+12
-16
lines changed

lib/matplotlib/mlab.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,9 +1951,11 @@ def rec_summarize(r, summaryfuncs):
19511951
def rec_join(key, r1, r2, jointype='inner', defaults=None):
19521952
"""
19531953
join record arrays r1 and r2 on key; key is a tuple of field
1954-
names. if r1 and r2 have equal values on all the keys in the key
1954+
names. If r1 and r2 have equal values on all the keys in the key
19551955
tuple, then their fields will be merged into a new record array
1956-
containing the intersection of the fields of r1 and r2
1956+
containing the intersection of the fields of r1 and r2.
1957+
1958+
r1 (also r2) must not have any duplicate keys.
19571959
19581960
The jointype keyword can be 'inner', 'outer', 'leftouter'.
19591961
To do a rightouter join just reverse r1 and r2.
@@ -1993,9 +1995,6 @@ def makekey(row):
19931995
right_ind = np.array([r2d[k] for k in right_keys])
19941996
right_len = len(right_ind)
19951997

1996-
r2 = rec_drop_fields(r2, r1.dtype.names)
1997-
1998-
19991998
def key_desc(name):
20001999
'if name is a string key, use the larger size of r1 or r2 before merging'
20012000
dt1 = r1.dtype[name]
@@ -2027,21 +2026,18 @@ def key_desc(name):
20272026
newrec[k] = v
20282027

20292028
for field in r1.dtype.names:
2030-
newrec[field][:common_len] = r1[field][r1ind]
2031-
if jointype == "outer" or jointype == "leftouter":
2029+
if common_len:
2030+
newrec[field][:common_len] = r1[field][r1ind]
2031+
if (jointype == "outer" or jointype == "leftouter") and left_len:
20322032
newrec[field][common_len:(common_len+left_len)] = r1[field][left_ind]
20332033

20342034
for field in r2.dtype.names:
2035-
newrec[field][:common_len] = r2[field][r2ind]
2036-
if jointype == "outer":
2037-
newrec[field][-right_len:] = r2[field][right_ind[right_ind.argsort()]]
2038-
2039-
# sort newrec using the same order as r1
2040-
sort_indices = r1ind.copy()
2041-
if jointype == "outer" or jointype == "leftouter":
2042-
sort_indices = np.append(sort_indices, left_ind)
2043-
newrec[:(common_len+left_len)] = newrec[sort_indices.argsort()]
2035+
if field not in key and common_len:
2036+
newrec[field][:common_len] = r2[field][r2ind]
2037+
if jointype == "outer" and right_len:
2038+
newrec[field][-right_len:] = r2[field][right_ind]
20442039

2040+
newrec.sort(order=key)
20452041

20462042
return newrec.view(np.recarray)
20472043

0 commit comments

Comments
 (0)