diff --git a/awkward/array/base.py b/awkward/array/base.py index aa3d6f05..7f12de08 100644 --- a/awkward/array/base.py +++ b/awkward/array/base.py @@ -66,10 +66,6 @@ def __bool__(self): __nonzero__ = __bool__ - @property - def jshape(self): - return self.type.jshape - @property def size(self): return len(self) diff --git a/awkward/type.py b/awkward/type.py index 1127ef86..bb317b0a 100644 --- a/awkward/type.py +++ b/awkward/type.py @@ -314,13 +314,6 @@ def dtype(self): else: return self._to.dtype - @property - def jshape(self): - if isinstance(self._to, awkward.util.numpy.dtype): - return (self._takes, self._to) - else: - return (self._takes,) + self._to.jshape - def _isnumpy(self, seen): if id(self) in seen: return False @@ -394,10 +387,6 @@ def dtype(self): out.append((n, x.dtype)) return awkward.util.numpy.dtype(out) - @property - def jshape(self): - return (dict((n, x if isinstance(x, awkward.util.numpy.dtype) else x.jshape) for n, x in self._fields.items()),) - def _isnumpy(self, seen): if id(self) in seen: return False @@ -474,10 +463,6 @@ def shape(self): def dtype(self): raise TypeError("Union has no Numpy dtype") - @property - def jshape(self): - return ([x.jshape for x in self._possibilities],) - def _isnumpy(self, seen): return False @@ -557,10 +542,6 @@ def shape(self): def dtype(self): return self._type.dtype - @property - def jshape(self): - return ([self._type.jshape, None],) - def _isnumpy(self, seen): if id(self) in seen: return False diff --git a/tests/test_objects.py b/tests/test_objects.py new file mode 100644 index 00000000..fb23fa9c --- /dev/null +++ b/tests/test_objects.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +# Copyright (c) 2018, DIANA-HEP +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the copyright holder nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import struct +import unittest + +import numpy + +from awkward import * + +class Test(unittest.TestCase): + def runTest(self): + pass + + def test_object_floats(self): + class Point(object): + def __init__(self, array): + self.x, self.y, self.z = array + def __repr__(self): + return "".format(self.x, self.y, self.z) + def __eq__(self, other): + return isinstance(other, Point) and self.x == other.x and self.y == other.y and self.z == other.z + + a = ObjectArray([[1.1, 2.2, 3.3], [4.4, 5.5, 6.6], [7.7, 8.8, 9.9]], Point) + self.assertEqual(a[0], Point([1.1, 2.2, 3.3])) + self.assertEqual(a[1], Point([4.4, 5.5, 6.6])) + self.assertEqual(a[2], Point([7.7, 8.8, 9.9])) + self.assertEqual(a[:].tolist(), [Point([1.1, 2.2, 3.3]), Point([4.4, 5.5, 6.6]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[::2].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[True, False, True]].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[2, 0]].tolist(), [Point([7.7, 8.8, 9.9]), Point([1.1, 2.2, 3.3])]) + + def test_object_bytes(self): + class Point(object): + def __init__(self, bytes): + self.x, self.y, self.z = struct.unpack("ddd", bytes) + def __repr__(self): + return "".format(self.x, self.y, self.z) + def __eq__(self, other): + return isinstance(other, Point) and self.x == other.x and self.y == other.y and self.z == other.z + + a = ObjectArray(numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]).view("u1").reshape(-1, 24), Point) + self.assertEqual(a[0], Point(numpy.array([1.1, 2.2, 3.3]).tobytes())) + self.assertEqual(a[1], Point(numpy.array([4.4, 5.5, 6.6]).tobytes())) + self.assertEqual(a[2], Point(numpy.array([7.7, 8.8, 9.9]).tobytes())) + self.assertEqual(a[:].tolist(), [Point(numpy.array([1.1, 2.2, 3.3]).tobytes()), Point(numpy.array([4.4, 5.5, 6.6]).tobytes()), Point(numpy.array([7.7, 8.8, 9.9]).tobytes())]) + self.assertEqual(a[::2].tolist(), [Point(numpy.array([1.1, 2.2, 3.3]).tobytes()), Point(numpy.array([7.7, 8.8, 9.9]).tobytes())]) + self.assertEqual(a[[True, False, True]].tolist(), [Point(numpy.array([1.1, 2.2, 3.3]).tobytes()), Point(numpy.array([7.7, 8.8, 9.9]).tobytes())]) + self.assertEqual(a[[2, 0]].tolist(), [Point(numpy.array([7.7, 8.8, 9.9]).tobytes()), Point(numpy.array([1.1, 2.2, 3.3]).tobytes())]) + + def test_object_indexedbytes(self): + class Point(object): + def __init__(self, array): + self.x, self.y, self.z = array + def __repr__(self): + return "".format(self.x, self.y, self.z) + def __eq__(self, other): + return isinstance(other, Point) and self.x == other.x and self.y == other.y and self.z == other.z + + a = ObjectArray(ByteIndexedArray([0, 24, 48], numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]).view("u1"), numpy.dtype((float, 3))), Point) + self.assertEqual(a[0], Point([1.1, 2.2, 3.3])) + self.assertEqual(a[1], Point([4.4, 5.5, 6.6])) + self.assertEqual(a[2], Point([7.7, 8.8, 9.9])) + self.assertEqual(a[:].tolist(), [Point([1.1, 2.2, 3.3]), Point([4.4, 5.5, 6.6]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[::2].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[True, False, True]].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[2, 0]].tolist(), [Point([7.7, 8.8, 9.9]), Point([1.1, 2.2, 3.3])]) + + def test_object_jaggedbytes(self): + class Point(object): + def __init__(self, array): + self.x, self.y, self.z = array + def __repr__(self): + return "".format(self.x, self.y, self.z) + def __eq__(self, other): + return isinstance(other, Point) and self.x == other.x and self.y == other.y and self.z == other.z + + a = ObjectArray(ByteJaggedArray.fromoffsets([0, 24, 48, 72], numpy.array([1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9]).view("u1"), float), Point) + self.assertEqual(a[0], Point([1.1, 2.2, 3.3])) + self.assertEqual(a[1], Point([4.4, 5.5, 6.6])) + self.assertEqual(a[2], Point([7.7, 8.8, 9.9])) + self.assertEqual(a[:].tolist(), [Point([1.1, 2.2, 3.3]), Point([4.4, 5.5, 6.6]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[::2].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[True, False, True]].tolist(), [Point([1.1, 2.2, 3.3]), Point([7.7, 8.8, 9.9])]) + self.assertEqual(a[[2, 0]].tolist(), [Point([7.7, 8.8, 9.9]), Point([1.1, 2.2, 3.3])])