def test_multidim_stack_multidim(self): # Multidim stack of arrays shape (4, 6) arrays = np.array([[ConstantArray((), i) for i in range(6)] for i in range(4)]) msg = 'multidimensional stacks not yet supported' with self.assertRaisesRegexp(ValueError, msg): ArrayStack.multidim_array_stack(arrays, (3, 2, 4))
def test_order_incorrect_order(self): # Specifying an unknown order. array1 = fake_array(0) array2 = fake_array(0) with self.assertRaisesRegexp(TypeError, 'order not understood'): ArrayStack.multidim_array_stack([array1, array2], (1, 2), order='random')
def test_stack_order_c_numpy_array_t2(self): # 1D stack of arrays shape (6,) # alternate shape res = ArrayStack.multidim_array_stack(self.arrays, (2, 3), order='C') arr = np.array([i for i in range(6)]) target = np.reshape(arr, (2, 3), order='C') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_stack_order_fortran_t1(self): # Fortran index ordering # 1D stack of arrays shape (6,) res = ArrayStack.multidim_array_stack(self.arrays, (3, 2), order='F') arr = np.array([i for i in range(6)]) target = np.reshape(arr, (3, 2), order='F') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_stack_order_default(self): # 1D stack of arrays shape (6,) # Ensure that the default index ordering corresponds to C. res = ArrayStack.multidim_array_stack(self.arrays, (3, 2)) arr = np.array([i for i in range(6)]) target = np.reshape(arr, (3, 2), order='C') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_stack_order_c_list(self): # 1D stack of arrays length 6 res = ArrayStack.multidim_array_stack(self.arrays.tolist(), (3, 2), order='C') arr = np.array([i for i in range(6)]) target = np.reshape(arr, (3, 2), order='C') self.assertTrue(np.array_equal(res.ndarray(), target))
def data(self): if not self._structure_calculated: self._calculate_structure() if self._data_cache is None: data_arrays = [f._data for f in self.fields] self._data_cache = ArrayStack.multidim_array_stack(data_arrays, self.vector_dims_shape) return self._data_cache
def test_stack_order_fortran_t2(self): # Fortran index ordering # 1D stack of arrays shape (6,) # alternate shape res = ArrayStack.multidim_array_stack(self.arrays, (2, 3), order='F') arr = np.arange(6) target = np.reshape(arr, (2, 3), order='F') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_stack_order_c_multidim(self): # 1D stack of 6 arrays each (4, 5) arrays = [NumpyArrayAdapter(np.arange(20).reshape(4, 5)) for i in range(6)] res = ArrayStack.multidim_array_stack(arrays, (2, 3), order='C') arr = np.arange(20).reshape(4, 5) * np.ones((6, 4, 5)) target = np.reshape(arr, (2, 3, 4, 5), order='C') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_not_arrays(self): class BadArray(object): dtype = 'f' fill_value = 9 shape = () bad_arrays = np.array([BadArray()]) with six.assertRaisesRegex(self, ValueError, 'subclass'): ArrayStack(bad_arrays)
def check(self, order): adapt = self.adapt expected = np.array([[0, 1], [2, 3]], order=order) orig = ArrayStack( np.array([[adapt(0), adapt(1)], [adapt(2), adapt(3)]], order=order, dtype=object)) copied = copy.deepcopy(orig) assert_array_equal(expected, copied.ndarray())
def data(self): if not self._structure_calculated: self._calculate_structure() if self._data_cache is None: data_arrays = [f._data for f in self.fields] self._data_cache = \ ArrayStack.multidim_array_stack(data_arrays, self.vector_dims_shape) return self._data_cache
def check(self, order): def adapt(value): return NumpyArrayAdapter(np.array(value)) expected = np.array([[0, 1], [2, 3]], order=order) orig = ArrayStack(np.array([[adapt(0), adapt(1)], [adapt(2), adapt(3)]], order=order, dtype=object)) copied = copy.deepcopy(orig) assert_array_equal(expected, copied.ndarray())
def check(self, order): adapt = self.adapt expected = np.array([[0, 1], [2, 3]], order=order) orig = ArrayStack(np.array([[adapt(0), adapt(1)], [adapt(2), adapt(3)]], order=order, dtype=object)) copied = copy.deepcopy(orig) assert_array_equal(expected, copied.ndarray()) for array in copied._stack.flat: self.assertTrue(isinstance(array, NumpyArrayAdapter))
def test_slice_copy(self): adapt = self.adapt shape = (2, 22, 2) data = [adapt(v) for v in range(np.cumprod(shape)[-1])] base = ArrayStack(np.array(data, dtype='O').reshape(shape)) s = (slice(None), (3, 7, 11, 15, 18, 21), slice(None)) actual = base[s] copied = copy.deepcopy(actual) expected = np.array( [[[6, 7], [14, 15], [22, 23], [30, 31], [36, 37], [42, 43]], [[50, 51], [58, 59], [66, 67], [74, 75], [80, 81], [86, 87]]], dtype='O') assert_array_equal(expected, copied.ndarray())
def test_different_strings(self): array1 = fake_array('foo', np.dtype('S3')) array2 = fake_array('bar', np.dtype('S3')) stack = ArrayStack(np.array([array1, array2])) self.assertEqual(stack.fill_value, b'N/A')
def test_stack_order_c_numpy_array_t1(self): # 1D stack of arrays shape (6,) res = ArrayStack.multidim_array_stack(self.arrays, (3, 2), order='C') arr = np.arange(6) target = np.reshape(arr, (3, 2), order='C') self.assertTrue(np.array_equal(res.ndarray(), target))
def test_incompatible_shape(self): # 1D stack of arrays shape (6,) # Specifying a stack shape that is not feasible. msg = 'total size of new array must be unchanged' with self.assertRaisesRegexp(ValueError, msg): ArrayStack.multidim_array_stack(self.arrays, (3, 1), order='C')
def test_different_strings(self): array1 = fake_array('foo', np.dtype('S3')) array2 = fake_array('bar', np.dtype('S3')) with self.assertRaises(ValueError): ArrayStack(np.array([array1, array2]))
def test_matching_strings(self): array1 = fake_array('foo', np.dtype('S3')) array2 = fake_array('foo', np.dtype('S3')) stack = ArrayStack(np.array([array1, array2])) self.assertEqual(stack.fill_value, 'foo')
def test_number_other_number(self): array1 = fake_array(42) array2 = fake_array(43) with self.assertRaises(ValueError): ArrayStack(np.array([array1, array2]))
def test_nan_nan(self): array1 = fake_array(np.nan) array2 = fake_array(np.nan) stack = ArrayStack(np.array([array1, array2])) self.assertTrue(np.isnan(stack.fill_value))
def test_number_number(self): array1 = fake_array(42) array2 = fake_array(42) stack = ArrayStack(np.array([array1, array2])) self.assertEqual(stack.fill_value, 42)
def setUp(self): self.a1 = ConstantArray([4, 3]) self.a2 = ConstantArray([4, 3]) self.a = ArrayStack([self.a1, self.a2])