8000 Merge pull request #7587 from mgeier/issue-7575 · numpy/numpy@c515fcd · GitHub
[go: up one dir, main page]

Skip to content

Commit c515fcd

Browse files
committed
Merge pull request #7587 from mgeier/issue-7575
BUG: linalg.norm(): Don't convert object arrays to float
2 parents f887fc4 + faa6cf3 commit c515fcd

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

numpy/linalg/linalg.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
csingle, cdouble, inexact, complexfloating, newaxis, ravel, all, Inf, dot,
2424
add, multiply, sqrt, maximum, fastCopyAndTranspose, sum, isfinite, size,
2525
finfo, errstate, geterrobj, longdouble, rollaxis, amin, amax, product, abs,
26-
broadcast, atleast_2d, intp, asanyarray, isscalar
26+
broadcast, atleast_2d, intp, asanyarray, isscalar, object_
2727
)
2828
from numpy.lib import triu, asfarray
2929
from numpy.linalg import lapack_lite, _umath_linalg
@@ -2112,7 +2112,7 @@ def norm(x, ord=None, axis=None, keepdims=False):
21122112
"""
21132113
x = asarray(x)
21142114

2115-
if not issubclass(x.dtype.type, inexact):
2115+
if not issubclass(x.dtype.type, (inexact, object_)):
21162116
x = x.astype(float)
21172117

21182118
# Immediately handle some default, simple, fast, and common cases.

numpy/linalg/tests/test_regression.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,52 @@ def test_svd_no_uv(self):
9090
assert_equal(np.linalg.matrix_rank(a), 1)
9191
assert_array_less(1, np.linalg.norm(a, ord=2))
9292

93+
def test_norm_object_array(self):
94+
# gh-7575
95+
testvector = np.array([np.array([0, 1]), 0, 0], dtype=object)
96+
97+
norm = linalg.norm(testvector)
98+
assert_array_equal(norm, [0, 1])
99+
self.assertEqual(norm.dtype, np.dtype('float64'))
100+
101+
norm = linalg.norm(testvector, ord=1)
102+
assert_array_equal(norm, [0, 1])
103+
self.assertNotEqual(norm.dtype, np.dtype('float64'))
104+
105+
norm = linalg.norm(testvector, ord=2)
106+
assert_array_equal(norm, [0, 1])
107+
self.assertEqual(norm.dtype, np.dtype('float64'))
108+
109+
self.assertRaises(ValueError, linalg.norm, testvector, ord='fro')
110+
self.assertRaises(ValueError, linalg.norm, testvector, ord='nuc')
111+
self.assertRaises(ValueError, linalg.norm, testvector, ord=np.inf)
112+
self.assertRaises(ValueError, linalg.norm, testvector, ord=-np.inf)
113+
self.assertRaises((AttributeError, DeprecationWarning),
114+
linalg.norm, testvector, ord=0)
115+
self.assertRaises(ValueError, linalg.norm, testvector, ord=-1)
116+
self.assertRaises(ValueError, linalg.norm, testvector, ord=-2)
117+
118+
testmatrix = np.array([[np.array([0, 1]), 0, 0],
119+
[0, 0, 0]], dtype=object)
120+
121+
norm = linalg.norm(testmatrix)
122+
assert_array_equal(norm, [0, 1])
123+
self.assertEqual(norm.dtype, np.dtype('float64'))
124+
125+
norm = linalg.norm(testmatrix, ord='fro')
126+
assert_array_equal(norm, [0, 1])
127+
self.assertEqual(norm.dtype, np.dtype('float64'))
128+
129+
self.assertRaises(TypeError, linalg.norm, testmatrix, ord='nuc')
130+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=np.inf)
131+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=-np.inf)
132+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=0)
133+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=1)
134+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=-1)
135+
self.assertRaises(TypeError, linalg.norm, testmatrix, ord=2)
136+
self.assertRaises(TypeError, linalg.norm, testmatrix, ord=-2)
137+
self.assertRaises(ValueError, linalg.norm, testmatrix, ord=3)
138+
93139

94140
if __name__ == '__main__':
95141
run_module_suite()

0 commit comments

Comments
 (0)
0