diff --git a/benchmarks/benchmarks/bench_linalg.py b/benchmarks/benchmarks/bench_linalg.py index e3a4be70276e..7f12d86ed347 100644 --- a/benchmarks/benchmarks/bench_linalg.py +++ b/benchmarks/benchmarks/bench_linalg.py @@ -103,6 +103,8 @@ def time_norm(self, typename): class LinalgSmallArrays(Benchmark): """ Test overhead of linalg methods for small arrays """ def setup(self): + self.array_3_3 = np.eye(3) + np.arange(9.).reshape((3, 3)) + self.array_3 = np.arange(3.) self.array_5 = np.arange(5.) self.array_5_5 = np.reshape(np.arange(25.), (5, 5)) @@ -112,6 +114,16 @@ def time_norm_small_array(self): def time_det_small_array(self): np.linalg.det(self.array_5_5) + def time_det_3x3(self): + np.linalg.det(self.array_3_3) + + def time_solve_3x3(self): + np.linalg.solve(self.array_3_3, self.array_3) + + def time_eig_3x3(self): + np.linalg.eig(self.array_3_3) + + class Lstsq(Benchmark): def setup(self): self.a = get_squares_()['float64'] diff --git a/numpy/linalg/_linalg.py b/numpy/linalg/_linalg.py index f5bc524a27ae..e181e1a5d8a8 100644 --- a/numpy/linalg/_linalg.py +++ b/numpy/linalg/_linalg.py @@ -197,7 +197,11 @@ def _assert_stacked_2d(*arrays): def _assert_stacked_square(*arrays): for a in arrays: - m, n = a.shape[-2:] + try: + m, n = a.shape[-2:] + except ValueError: + raise LinAlgError('%d-dimensional array given. Array must be ' + 'at least two-dimensional' % a.ndim) if m != n: raise LinAlgError('Last 2 dimensions of the array must be square') @@ -392,7 +396,6 @@ def solve(a, b): """ a, _ = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) b, wrap = _makearray(b) t, result_t = _commonType(a, b) @@ -599,7 +602,6 @@ def inv(a): """ a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) @@ -681,7 +683,6 @@ def matrix_power(a, n): """ a = asanyarray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) try: @@ -830,7 +831,6 @@ def cholesky(a, /, *, upper=False): """ gufunc = _umath_linalg.cholesky_up if upper else _umath_linalg.cholesky_lo a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) signature = 'D->D' if isComplexType(t) else 'd->d' @@ -1201,7 +1201,6 @@ def eigvals(a): """ a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) _assert_finite(a) t, result_t = _commonType(a) @@ -1310,7 +1309,6 @@ def eigvalsh(a, UPLO='L'): gufunc = _umath_linalg.eigvalsh_up a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) signature = 'D->d' if isComplexType(t) else 'd->d' @@ -1320,11 +1318,6 @@ def eigvalsh(a, UPLO='L'): w = gufunc(a, signature=signature) return w.astype(_realType(result_t), copy=False) -def _convertarray(a): - t, result_t = _commonType(a) - a = a.astype(t).T.copy() - return a, t, result_t - # Eigenvectors @@ -1461,7 +1454,6 @@ def eig(a): """ a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) _assert_finite(a) t, result_t = _commonType(a) @@ -1612,7 +1604,6 @@ def eigh(a, UPLO='L'): raise ValueError("UPLO argument must be 'L' or 'U'") a, wrap = _makearray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) @@ -1978,7 +1969,6 @@ def cond(x, p=None): else: # Call inv(x) ignoring errors. The result array will # contain nans in the entries where inversion failed. - _assert_stacked_2d(x) _assert_stacked_square(x) t, result_t = _commonType(x) signature = 'D->D' if isComplexType(t) else 'd->d' @@ -2318,7 +2308,6 @@ def slogdet(a): """ a = asarray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) real_t = _realType(result_t) @@ -2377,7 +2366,6 @@ def det(a): """ a = asarray(a) - _assert_stacked_2d(a) _assert_stacked_square(a) t, result_t = _commonType(a) signature = 'D->D' if isComplexType(t) else 'd->d'