-
-
Notifications
You must be signed in to change notification settings - Fork 11.8k
Closed
Labels
01 - Enhancement56 - Needs Release Note.Needs an entry in doc/release/upcoming_changesNeeds an entry in doc/release/upcoming_changescomponent: numpy.linalg
Description
When linalg.cond is given a complex input, the output dtype is either the downgraded value type or the complex type, depending on which order value p is given. In contrast, linalg.norm always returns the downgraded value type, for all possible order values.
To improve linalg.cond's consistency with itself and with linalg.norm, it would probably be best if linalg.cond always returns the downgraded value type.
When cond returns a complex value, its imaginary part is always 0 (as far as I understand), so downgrading the type shouldn't affect value correctness.
Reproducing code example:
Behavior of cond:
>>> import numpy as np
>>> a = np.random.randn(10, 10) + 1j * np.random.randn(10, 10)
>>> np.linalg.cond(a, p=None)
72.2881023589724
>>> np.linalg.cond(a, p=2)
72.2881023589724
>>> np.linalg.cond(a, p=-2)
0.013833535082082288
>>> np.linalg.cond(a, p=1)
(253.11513101087314+0j)
>>> np.linalg.cond(a, p=-1)
(15.869620616376949+0j)
>>> np.linalg.cond(a, p=float('inf'))
(200.2689864179095+0j)
>>> np.linalg.cond(a, p=-float('inf'))
(24.578874030599213+0j)
>>> np.linalg.cond(a, p='fro')
(126.26418916571008+0j)
>>> np.linalg.cond(a, p='nuc')
(452.1421038722304+0j)Behavior of norm:
>>> import numpy as np
>>> a = np.random.randn(10, 10) + 1j * np.random.randn(10, 10)
>>> np.linalg.norm(a, ord=None)
14.445562956889793
>>> np.linalg.norm(a, ord=2)
8.343686487155832
>>> np.linalg.norm(a, ord=-2)
0.11542267973396612
>>> np.linalg.norm(a, ord=1)
16.439210053387864
>>> np.linalg.norm(a, ord=-1)
9.113381379488501
>>> np.linalg.norm(a, ord=float('inf'))
15.027415916886657
>>> np.linalg.norm(a, ord=-float('inf'))
8.36772188424056
>>> np.linalg.norm(a, ord='fro')
14.445562956889793
>>> np.linalg.norm(a, ord='nuc')
39.26235633671831NumPy/Python version information:
>>> print(np.__version__, sys.version)
1.19.1 3.7.7 (default, Mar 26 2020, 15:48:22)
[GCC 7.3.0]seberg and broesler
Metadata
Metadata
Assignees
Labels
01 - Enhancement56 - Needs Release Note.Needs an entry in doc/release/upcoming_changesNeeds an entry in doc/release/upcoming_changescomponent: numpy.linalg