File fix_numpy_recarrays.patch of Package python-featureflow
From 450b7638118656df88db44a07744d1c47b947f74 Mon Sep 17 00:00:00 2001
From: John Vinyard <john.vinyard@gmail.com>
Date: Mon, 5 Nov 2018 20:15:02 -0600
Subject: [PATCH] More correct code for packing recarrays. Addresses issue #7
---
featureflow/nmpy.py | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/featureflow/nmpy.py b/featureflow/nmpy.py
index 165bbb3..b47ab9a 100644
--- a/featureflow/nmpy.py
+++ b/featureflow/nmpy.py
@@ -77,8 +77,29 @@ class PackedNumpyEncoder(NumpyEncoder):
def __init__(self, needs=None):
super(PackedNumpyEncoder, self).__init__(needs=needs)
+ def _pack_recarray(self, recarr):
+ fields = recarr.dtype.fields
+
+ packed_data = dict()
+ new_dtype = []
+
+ for name in fields.iterkeys():
+ view = recarr[name].copy().view(np.uint8) \
+ .reshape(recarr.shape + (-1,))
+ packed_data[name] = view
+ new_dtype.append((name, np.uint8, view.shape[1:]))
+
+ packed_recarray = np.recarray(recarr.shape, dtype=new_dtype)
+
+ for name, value in packed_data.iteritems():
+ packed_recarray[name] = value
+ return packed_recarray
+
def _prepare_data(self, data):
- return np.packbits(data.astype(np.uint8), axis=-1)
+ try:
+ return np.packbits(data.astype(np.uint8), axis=-1)
+ except ValueError:
+ return self._pack_recarray(data)
def _np_from_buffer(b, shape, dtype):