Revision: 6170 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=6170&view=rev Author: sameerd Date: 2008-10-08 14:38:26 +0000 (Wed, 08 Oct 2008)
Log Message: ----------- rec_join now handles two record arrays with the same column names with "*fixes" Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/mlab.py Modified: trunk/matplotlib/lib/matplotlib/mlab.py =================================================================== --- trunk/matplotlib/lib/matplotlib/mlab.py 2008-10-08 14:09:55 UTC (rev 6169) +++ trunk/matplotlib/lib/matplotlib/mlab.py 2008-10-08 14:38:26 UTC (rev 6170) @@ -1665,6 +1665,14 @@ except TypeError: return False else: return b +def rec_view(rec): + """ Return a view of an ndarray as a recarray + http://projects.scipy.org/pipermail/numpy-discussion/2008-August/036429.html + Reverting Travis' fix because it doesn't work for object arrays + """ + return rec.view(np.recarray) + #return rec.view(dtype=(np.record, rec.dtype), type=np.recarray) + def rec_append_field(rec, name, arr, dtype=None): """ return a new record array with field name populated with data from array arr. @@ -1703,7 +1711,7 @@ newrec[field] = rec[field] for name, arr in zip(names, arrs): newrec[name] = arr - return newrec.view(np.recarray) + return rec_view(newrec) def rec_drop_fields(rec, names): @@ -1719,7 +1727,7 @@ for field in newdtype.names: newrec[field] = rec[field] - return newrec.view(np.recarray) + return rec_view(newrec) @@ -1789,7 +1797,7 @@ return np.rec.fromarrays(arrays, names=names) -def rec_join(key, r1, r2, jointype='inner', defaults=None): +def rec_join(key, r1, r2, jointype='inner', defaults=None, r1postfix='1', r2postfix='2'): """ join record arrays r1 and r2 on key; key is a tuple of field names. If r1 and r2 have equal values on all the keys in the key @@ -1803,6 +1811,9 @@ The defaults keyword is a dictionary filled with {column_name:default_value} pairs. + + The keywords r1postfix and r2postfix are postfixed to column names + (other than keys) that are both in r1 and r2. """ for name in key: @@ -1850,13 +1861,21 @@ return (name, dt2.descr[0][1]) - keydesc = [key_desc(name) for name in key] + + def mapped_r1field(name): + """ the column name in newrec that corresponds to the colmn in r1 """ + if name in key or name not in r2.dtype.names: return name + else: return name + r1postfix - newdtype = np.dtype(keydesc + - [desc for desc in r1.dtype.descr if desc[0] not in key ] + - [desc for desc in r2.dtype.descr if desc[0] not in key ] ) + def mapped_r2field(name): + """ the column name in newrec that corresponds to the colmn in r2 """ + if name in key or name not in r1.dtype.names: return name + else: return name + r2postfix + r1desc = [(mapped_r1field(desc[0]), desc[1]) for desc in r1.dtype.descr if desc[0] not in key] + r2desc = [(mapped_r2field(desc[0]), desc[1]) for desc in r2.dtype.descr if desc[0] not in key] + newdtype = np.dtype(keydesc + r1desc + r2desc) newrec = np.empty(common_len + left_len + right_len, dtype=newdtype) @@ -1867,20 +1886,22 @@ newrec[k] = v for field in r1.dtype.names: + newfield = mapped_r1field(field) if common_len: - newrec[field][:common_len] = r1[field][r1ind] + newrec[newfield][:common_len] = r1[field][r1ind] if (jointype == "outer" or jointype == "leftouter") and left_len: - newrec[field][common_len:(common_len+left_len)] = r1[field][left_ind] + newrec[newfield][common_len:(common_len+left_len)] = r1[field][left_ind] for field in r2.dtype.names: + newfield = mapped_r2field(field) if field not in key and common_len: - newrec[field][:common_len] = r2[field][r2ind] + newrec[newfield][:common_len] = r2[field][r2ind] if jointype == "outer" and right_len: - newrec[field][-right_len:] = r2[field][right_ind] + newrec[newfield][-right_len:] = r2[field][right_ind] newrec.sort(order=key) - return newrec.view(np.recarray) + return rec_view(newrec) def csv2rec(fname, comments='#', skiprows=0, checkrows=0, delimiter=',', This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Matplotlib-checkins mailing list Matplotlib-checkins@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins