diff --git a/pint/quantity.py b/pint/quantity.py index 22bcfbf..d9286ba 100644 --- a/pint/quantity.py +++ b/pint/quantity.py @@ -893,9 +893,21 @@ class _Quantity(SharedRegistryObject): if isinstance(getattr(other, '_magnitude', other), ndarray): # arrays are refused as exponent, because they would create - # len(array) quanitites of len(set(array)) different units - if np.size(other) > 1: - raise DimensionalityError(self._units, 'dimensionless') + # len(array) quantities of len(set(array)) different units + # unless the base is dimensionless. + if self.dimensionless: + if getattr(other, 'dimensionless', False): + self._magnitude **= other.m_as('') + return self + elif not getattr(other, 'dimensionless', True): + raise DimensionalityError(other._units, 'dimensionless') + else: + self._magnitude **= other + return self + elif np.size(other) > 1: + raise DimensionalityError(self._units, 'dimensionless', + extra_msg='Quantity array exponents are only allowed ' + 'if the base is dimensionless') if other == 1: return self @@ -930,9 +942,19 @@ class _Quantity(SharedRegistryObject): if isinstance(getattr(other, '_magnitude', other), ndarray): # arrays are refused as exponent, because they would create - # len(array) quantities of len(set(array)) different units - if np.size(other) > 1: - raise DimensionalityError(self._units, 'dimensionless') + # len(array) quantities of len(set(array)) different units + # unless the base is dimensionless. + if self.dimensionless: + if getattr(other, 'dimensionless', False): + return self.__class__(self.m ** other.m_as('')) + elif not getattr(other, 'dimensionless', True): + raise DimensionalityError(other._units, 'dimensionless') + else: + return self.__class__(self.m ** other) + elif np.size(other) > 1: + raise DimensionalityError(self._units, 'dimensionless', + extra_msg='Quantity array exponents are only allowed ' + 'if the base is dimensionless') new_self = self if other == 1: diff --git a/pint/testsuite/test_issues.py b/pint/testsuite/test_issues.py index 4a9e8b7..05a432c 100644 --- a/pint/testsuite/test_issues.py +++ b/pint/testsuite/test_issues.py @@ -546,4 +546,11 @@ class TestIssuesNP(QuantityTestCase): x = ureg.Quantity(1., 'meter') y = f(x) z = x * y - self.assertEquals(z, ureg.Quantity(1., 'meter * kilogram')) \ No newline at end of file + self.assertEquals(z, ureg.Quantity(1., 'meter * kilogram')) + + def test_issue483(self): + ureg = self.ureg + a = np.asarray([1, 2, 3]) + q = [1, 2, 3] * ureg.dimensionless + p = (q ** q).m + np.testing.assert_array_equal(p, a ** a) \ No newline at end of file diff --git a/pint/testsuite/test_numpy.py b/pint/testsuite/test_numpy.py index ea23c8e..7d3271c 100644 --- a/pint/testsuite/test_numpy.py +++ b/pint/testsuite/test_numpy.py @@ -427,7 +427,7 @@ class TestNDArrayQunatityMath(QuantityTestCase): @helpers.requires_numpy() def test_exponentiation_array_exp(self): arr = np.array(range(3), dtype=np.float) - q = self.Q_(arr, None) + q = self.Q_(arr, 'meter') for op_ in [op.pow, op.ipow]: q_cp = copy.copy(q)