def add_computed_fields(self, json_cmd): print('Adding computed fields') cmd = json.loads(json_cmd) array_url = cmd.get('input', self.base_url + self.array_name) if not array_url.startswith(self.base_url): raise RuntimeError('Input array must start with the base url') array_name = array_url[len(self.base_url):] fields = cmd['fields'] rm_fields = cmd.get('rm_fields', []) fnname = cmd.get('fnname', None) arr = self.get_session_array(array_name).ddesc.dynd_arr() res = nd.add_computed_fields(arr, fields, rm_fields, fnname) defarr = self.array_provider.create_deferred_array_filename( self.session_name, 'computed_fields_', array(res)) dshape = nd.dshape_of(res) defarr[0].write(json.dumps({ 'dshape': dshape, 'command': 'add_computed_fields', 'params': { 'fields': fields, 'rm_fields': rm_fields, 'fnname': fnname } })) defarr[0].close() content_type = 'application/json; charset=utf-8' body = json.dumps({ 'session': self.base_url + self.session_name, 'output': self.base_url + defarr[1], 'dshape': dshape }) return (content_type, body)
def add_computed_fields(self, json_cmd): print('Adding computed fields') cmd = json.loads(json_cmd) array_url = cmd.get('input', self.base_url + self.array_name) if not array_url.startswith(self.base_url): raise RuntimeError('Input array must start with the base url') array_name = array_url[len(self.base_url):] fields = cmd['fields'] rm_fields = cmd.get('rm_fields', []) fnname = cmd.get('fnname', None) arr = self.get_session_array(array_name).ddesc.dynd_arr() res = nd.add_computed_fields(arr, fields, rm_fields, fnname) defarr = self.array_provider.create_deferred_array_filename( self.session_name, 'computed_fields_', array(res)) dshape = nd.dshape_of(res) defarr[0].write( json.dumps({ 'dshape': dshape, 'command': 'add_computed_fields', 'params': { 'fields': fields, 'rm_fields': rm_fields, 'fnname': fnname } })) defarr[0].close() content_type = 'application/json; charset=utf-8' body = json.dumps({ 'session': self.base_url + self.session_name, 'output': self.base_url + defarr[1], 'dshape': dshape }) return (content_type, body)
def test_simple_expr(self): a = np.array([(1,), (2,), (3,), (4,), (5,)], dtype=[('xyz', np.int32)]) b = nd.add_computed_fields(a, [('twice', np.int32, '2 * xyz'), ('onemore', np.int16, 'xyz + 1')]) self.assertEqual(nd.type_of(b).element_type.type_id, 'unary_expr') self.assertEqual(nd.type_of(b).element_type.value_type, ndt.type('c{xyz: int32, twice: int32, onemore: int16}')) self.assertEqual(nd.as_py(b.xyz), [1, 2, 3, 4, 5]) self.assertEqual(nd.as_py(b.twice), [2, 4, 6, 8, 10]) self.assertEqual(nd.as_py(b.onemore), [2, 3, 4, 5, 6])
def test_rm_fields(self): a = np.array([(1, 2), (-1, 1), (2, 5)], dtype=[('x', np.float32), ('y', np.float32)]) b = nd.add_computed_fields(a, fields=[('sum', np.float32, 'x + y'), ('difference', np.float32, 'x - y'), ('product', np.float32, 'x * y'), ('complex', np.complex64, 'x + 1j*y')], rm_fields=['x', 'y']) self.assertEqual(nd.type_of(b).element_type.value_type, ndt.type('c{sum: float32, difference: float32,' + ' product: float32, complex: complex[float32]}')) self.assertEqual(nd.as_py(b.sum), [3, 0, 7]), self.assertEqual(nd.as_py(b.difference), [-1, -2, -3]) self.assertEqual(nd.as_py(b.product), [2, -1, 10]) self.assertEqual(nd.as_py(b.complex), [1+2j, -1+1j, 2+5j])