@@ -1951,9 +1951,11 @@ def rec_summarize(r, summaryfuncs):
1951
1951
def rec_join (key , r1 , r2 , jointype = 'inner' , defaults = None ):
1952
1952
"""
1953
1953
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
1955
1955
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.
1957
1959
1958
1960
The jointype keyword can be 'inner', 'outer', 'leftouter'.
1959
1961
To do a rightouter join just reverse r1 and r2.
@@ -1993,9 +1995,6 @@ def makekey(row):
1993
1995
right_ind = np .array ([r2d [k ] for k in right_keys ])
1994
1996
right_len = len (right_ind )
1995
1997
1996
- r2 = rec_drop_fields (r2 , r1 .dtype .names )
1997
-
1998
-
1999
1998
def key_desc (name ):
2000
1999
'if name is a string key, use the larger size of r1 or r2 before merging'
2001
2000
dt1 = r1 .dtype [name ]
@@ -2027,21 +2026,18 @@ def key_desc(name):
2027
2026
newrec [k ] = v
2028
2027
2029
2028
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 :
2032
2032
newrec [field ][common_len :(common_len + left_len )] = r1 [field ][left_ind ]
2033
2033
2034
2034
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 ]
2044
2039
2040
+ newrec .sort (order = key )
2045
2041
2046
2042
return newrec .view (np .recarray )
2047
2043
0 commit comments