Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/numpy/matrixlib/defmatrix.py: 19%

238 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1__all__ = ['matrix', 'bmat', 'mat', 'asmatrix'] 

2 

3import sys 

4import warnings 

5import ast 

6import numpy.core.numeric as N 

7from numpy.core.numeric import concatenate, isscalar 

8from numpy.core.overrides import set_module 

9# While not in __all__, matrix_power used to be defined here, so we import 

10# it for backward compatibility. 

11from numpy.linalg import matrix_power 

12 

13 

14def _convert_from_string(data): 

15 for char in '[]': 

16 data = data.replace(char, '') 

17 

18 rows = data.split(';') 

19 newdata = [] 

20 count = 0 

21 for row in rows: 

22 trow = row.split(',') 

23 newrow = [] 

24 for col in trow: 

25 temp = col.split() 

26 newrow.extend(map(ast.literal_eval, temp)) 

27 if count == 0: 

28 Ncols = len(newrow) 

29 elif len(newrow) != Ncols: 

30 raise ValueError("Rows not the same size.") 

31 count += 1 

32 newdata.append(newrow) 

33 return newdata 

34 

35 

36@set_module('numpy') 

37def asmatrix(data, dtype=None): 

38 """ 

39 Interpret the input as a matrix. 

40 

41 Unlike `matrix`, `asmatrix` does not make a copy if the input is already 

42 a matrix or an ndarray. Equivalent to ``matrix(data, copy=False)``. 

43 

44 Parameters 

45 ---------- 

46 data : array_like 

47 Input data. 

48 dtype : data-type 

49 Data-type of the output matrix. 

50 

51 Returns 

52 ------- 

53 mat : matrix 

54 `data` interpreted as a matrix. 

55 

56 Examples 

57 -------- 

58 >>> x = np.array([[1, 2], [3, 4]]) 

59 

60 >>> m = np.asmatrix(x) 

61 

62 >>> x[0,0] = 5 

63 

64 >>> m 

65 matrix([[5, 2], 

66 [3, 4]]) 

67 

68 """ 

69 return matrix(data, dtype=dtype, copy=False) 

70 

71 

72@set_module('numpy') 

73class matrix(N.ndarray): 

74 """ 

75 matrix(data, dtype=None, copy=True) 

76 

77 .. note:: It is no longer recommended to use this class, even for linear 

78 algebra. Instead use regular arrays. The class may be removed 

79 in the future. 

80 

81 Returns a matrix from an array-like object, or from a string of data. 

82 A matrix is a specialized 2-D array that retains its 2-D nature 

83 through operations. It has certain special operators, such as ``*`` 

84 (matrix multiplication) and ``**`` (matrix power). 

85 

86 Parameters 

87 ---------- 

88 data : array_like or string 

89 If `data` is a string, it is interpreted as a matrix with commas 

90 or spaces separating columns, and semicolons separating rows. 

91 dtype : data-type 

92 Data-type of the output matrix. 

93 copy : bool 

94 If `data` is already an `ndarray`, then this flag determines 

95 whether the data is copied (the default), or whether a view is 

96 constructed. 

97 

98 See Also 

99 -------- 

100 array 

101 

102 Examples 

103 -------- 

104 >>> a = np.matrix('1 2; 3 4') 

105 >>> a 

106 matrix([[1, 2], 

107 [3, 4]]) 

108 

109 >>> np.matrix([[1, 2], [3, 4]]) 

110 matrix([[1, 2], 

111 [3, 4]]) 

112 

113 """ 

114 __array_priority__ = 10.0 

115 def __new__(subtype, data, dtype=None, copy=True): 

116 warnings.warn('the matrix subclass is not the recommended way to ' 

117 'represent matrices or deal with linear algebra (see ' 

118 'https://docs.scipy.org/doc/numpy/user/' 

119 'numpy-for-matlab-users.html). ' 

120 'Please adjust your code to use regular ndarray.', 

121 PendingDeprecationWarning, stacklevel=2) 

122 if isinstance(data, matrix): 

123 dtype2 = data.dtype 

124 if (dtype is None): 

125 dtype = dtype2 

126 if (dtype2 == dtype) and (not copy): 

127 return data 

128 return data.astype(dtype) 

129 

130 if isinstance(data, N.ndarray): 

131 if dtype is None: 

132 intype = data.dtype 

133 else: 

134 intype = N.dtype(dtype) 

135 new = data.view(subtype) 

136 if intype != data.dtype: 

137 return new.astype(intype) 

138 if copy: return new.copy() 

139 else: return new 

140 

141 if isinstance(data, str): 

142 data = _convert_from_string(data) 

143 

144 # now convert data to an array 

145 arr = N.array(data, dtype=dtype, copy=copy) 

146 ndim = arr.ndim 

147 shape = arr.shape 

148 if (ndim > 2): 

149 raise ValueError("matrix must be 2-dimensional") 

150 elif ndim == 0: 

151 shape = (1, 1) 

152 elif ndim == 1: 

153 shape = (1, shape[0]) 

154 

155 order = 'C' 

156 if (ndim == 2) and arr.flags.fortran: 

157 order = 'F' 

158 

159 if not (order or arr.flags.contiguous): 

160 arr = arr.copy() 

161 

162 ret = N.ndarray.__new__(subtype, shape, arr.dtype, 

163 buffer=arr, 

164 order=order) 

165 return ret 

166 

167 def __array_finalize__(self, obj): 

168 self._getitem = False 

169 if (isinstance(obj, matrix) and obj._getitem): return 

170 ndim = self.ndim 

171 if (ndim == 2): 

172 return 

173 if (ndim > 2): 

174 newshape = tuple([x for x in self.shape if x > 1]) 

175 ndim = len(newshape) 

176 if ndim == 2: 

177 self.shape = newshape 

178 return 

179 elif (ndim > 2): 

180 raise ValueError("shape too large to be a matrix.") 

181 else: 

182 newshape = self.shape 

183 if ndim == 0: 

184 self.shape = (1, 1) 

185 elif ndim == 1: 

186 self.shape = (1, newshape[0]) 

187 return 

188 

189 def __getitem__(self, index): 

190 self._getitem = True 

191 

192 try: 

193 out = N.ndarray.__getitem__(self, index) 

194 finally: 

195 self._getitem = False 

196 

197 if not isinstance(out, N.ndarray): 

198 return out 

199 

200 if out.ndim == 0: 

201 return out[()] 

202 if out.ndim == 1: 

203 sh = out.shape[0] 

204 # Determine when we should have a column array 

205 try: 

206 n = len(index) 

207 except Exception: 

208 n = 0 

209 if n > 1 and isscalar(index[1]): 

210 out.shape = (sh, 1) 

211 else: 

212 out.shape = (1, sh) 

213 return out 

214 

215 def __mul__(self, other): 

216 if isinstance(other, (N.ndarray, list, tuple)) : 

217 # This promotes 1-D vectors to row vectors 

218 return N.dot(self, asmatrix(other)) 

219 if isscalar(other) or not hasattr(other, '__rmul__') : 

220 return N.dot(self, other) 

221 return NotImplemented 

222 

223 def __rmul__(self, other): 

224 return N.dot(other, self) 

225 

226 def __imul__(self, other): 

227 self[:] = self * other 

228 return self 

229 

230 def __pow__(self, other): 

231 return matrix_power(self, other) 

232 

233 def __ipow__(self, other): 

234 self[:] = self ** other 

235 return self 

236 

237 def __rpow__(self, other): 

238 return NotImplemented 

239 

240 def _align(self, axis): 

241 """A convenience function for operations that need to preserve axis 

242 orientation. 

243 """ 

244 if axis is None: 

245 return self[0, 0] 

246 elif axis==0: 

247 return self 

248 elif axis==1: 

249 return self.transpose() 

250 else: 

251 raise ValueError("unsupported axis") 

252 

253 def _collapse(self, axis): 

254 """A convenience function for operations that want to collapse 

255 to a scalar like _align, but are using keepdims=True 

256 """ 

257 if axis is None: 

258 return self[0, 0] 

259 else: 

260 return self 

261 

262 # Necessary because base-class tolist expects dimension 

263 # reduction by x[0] 

264 def tolist(self): 

265 """ 

266 Return the matrix as a (possibly nested) list. 

267 

268 See `ndarray.tolist` for full documentation. 

269 

270 See Also 

271 -------- 

272 ndarray.tolist 

273 

274 Examples 

275 -------- 

276 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

277 matrix([[ 0, 1, 2, 3], 

278 [ 4, 5, 6, 7], 

279 [ 8, 9, 10, 11]]) 

280 >>> x.tolist() 

281 [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] 

282 

283 """ 

284 return self.__array__().tolist() 

285 

286 # To preserve orientation of result... 

287 def sum(self, axis=None, dtype=None, out=None): 

288 """ 

289 Returns the sum of the matrix elements, along the given axis. 

290 

291 Refer to `numpy.sum` for full documentation. 

292 

293 See Also 

294 -------- 

295 numpy.sum 

296 

297 Notes 

298 ----- 

299 This is the same as `ndarray.sum`, except that where an `ndarray` would 

300 be returned, a `matrix` object is returned instead. 

301 

302 Examples 

303 -------- 

304 >>> x = np.matrix([[1, 2], [4, 3]]) 

305 >>> x.sum() 

306 10 

307 >>> x.sum(axis=1) 

308 matrix([[3], 

309 [7]]) 

310 >>> x.sum(axis=1, dtype='float') 

311 matrix([[3.], 

312 [7.]]) 

313 >>> out = np.zeros((2, 1), dtype='float') 

314 >>> x.sum(axis=1, dtype='float', out=np.asmatrix(out)) 

315 matrix([[3.], 

316 [7.]]) 

317 

318 """ 

319 return N.ndarray.sum(self, axis, dtype, out, keepdims=True)._collapse(axis) 

320 

321 

322 # To update docstring from array to matrix... 

323 def squeeze(self, axis=None): 

324 """ 

325 Return a possibly reshaped matrix. 

326 

327 Refer to `numpy.squeeze` for more documentation. 

328 

329 Parameters 

330 ---------- 

331 axis : None or int or tuple of ints, optional 

332 Selects a subset of the axes of length one in the shape. 

333 If an axis is selected with shape entry greater than one, 

334 an error is raised. 

335 

336 Returns 

337 ------- 

338 squeezed : matrix 

339 The matrix, but as a (1, N) matrix if it had shape (N, 1). 

340 

341 See Also 

342 -------- 

343 numpy.squeeze : related function 

344 

345 Notes 

346 ----- 

347 If `m` has a single column then that column is returned 

348 as the single row of a matrix. Otherwise `m` is returned. 

349 The returned matrix is always either `m` itself or a view into `m`. 

350 Supplying an axis keyword argument will not affect the returned matrix 

351 but it may cause an error to be raised. 

352 

353 Examples 

354 -------- 

355 >>> c = np.matrix([[1], [2]]) 

356 >>> c 

357 matrix([[1], 

358 [2]]) 

359 >>> c.squeeze() 

360 matrix([[1, 2]]) 

361 >>> r = c.T 

362 >>> r 

363 matrix([[1, 2]]) 

364 >>> r.squeeze() 

365 matrix([[1, 2]]) 

366 >>> m = np.matrix([[1, 2], [3, 4]]) 

367 >>> m.squeeze() 

368 matrix([[1, 2], 

369 [3, 4]]) 

370 

371 """ 

372 return N.ndarray.squeeze(self, axis=axis) 

373 

374 

375 # To update docstring from array to matrix... 

376 def flatten(self, order='C'): 

377 """ 

378 Return a flattened copy of the matrix. 

379 

380 All `N` elements of the matrix are placed into a single row. 

381 

382 Parameters 

383 ---------- 

384 order : {'C', 'F', 'A', 'K'}, optional 

385 'C' means to flatten in row-major (C-style) order. 'F' means to 

386 flatten in column-major (Fortran-style) order. 'A' means to 

387 flatten in column-major order if `m` is Fortran *contiguous* in 

388 memory, row-major order otherwise. 'K' means to flatten `m` in 

389 the order the elements occur in memory. The default is 'C'. 

390 

391 Returns 

392 ------- 

393 y : matrix 

394 A copy of the matrix, flattened to a `(1, N)` matrix where `N` 

395 is the number of elements in the original matrix. 

396 

397 See Also 

398 -------- 

399 ravel : Return a flattened array. 

400 flat : A 1-D flat iterator over the matrix. 

401 

402 Examples 

403 -------- 

404 >>> m = np.matrix([[1,2], [3,4]]) 

405 >>> m.flatten() 

406 matrix([[1, 2, 3, 4]]) 

407 >>> m.flatten('F') 

408 matrix([[1, 3, 2, 4]]) 

409 

410 """ 

411 return N.ndarray.flatten(self, order=order) 

412 

413 def mean(self, axis=None, dtype=None, out=None): 

414 """ 

415 Returns the average of the matrix elements along the given axis. 

416 

417 Refer to `numpy.mean` for full documentation. 

418 

419 See Also 

420 -------- 

421 numpy.mean 

422 

423 Notes 

424 ----- 

425 Same as `ndarray.mean` except that, where that returns an `ndarray`, 

426 this returns a `matrix` object. 

427 

428 Examples 

429 -------- 

430 >>> x = np.matrix(np.arange(12).reshape((3, 4))) 

431 >>> x 

432 matrix([[ 0, 1, 2, 3], 

433 [ 4, 5, 6, 7], 

434 [ 8, 9, 10, 11]]) 

435 >>> x.mean() 

436 5.5 

437 >>> x.mean(0) 

438 matrix([[4., 5., 6., 7.]]) 

439 >>> x.mean(1) 

440 matrix([[ 1.5], 

441 [ 5.5], 

442 [ 9.5]]) 

443 

444 """ 

445 return N.ndarray.mean(self, axis, dtype, out, keepdims=True)._collapse(axis) 

446 

447 def std(self, axis=None, dtype=None, out=None, ddof=0): 

448 """ 

449 Return the standard deviation of the array elements along the given axis. 

450 

451 Refer to `numpy.std` for full documentation. 

452 

453 See Also 

454 -------- 

455 numpy.std 

456 

457 Notes 

458 ----- 

459 This is the same as `ndarray.std`, except that where an `ndarray` would 

460 be returned, a `matrix` object is returned instead. 

461 

462 Examples 

463 -------- 

464 >>> x = np.matrix(np.arange(12).reshape((3, 4))) 

465 >>> x 

466 matrix([[ 0, 1, 2, 3], 

467 [ 4, 5, 6, 7], 

468 [ 8, 9, 10, 11]]) 

469 >>> x.std() 

470 3.4520525295346629 # may vary 

471 >>> x.std(0) 

472 matrix([[ 3.26598632, 3.26598632, 3.26598632, 3.26598632]]) # may vary 

473 >>> x.std(1) 

474 matrix([[ 1.11803399], 

475 [ 1.11803399], 

476 [ 1.11803399]]) 

477 

478 """ 

479 return N.ndarray.std(self, axis, dtype, out, ddof, keepdims=True)._collapse(axis) 

480 

481 def var(self, axis=None, dtype=None, out=None, ddof=0): 

482 """ 

483 Returns the variance of the matrix elements, along the given axis. 

484 

485 Refer to `numpy.var` for full documentation. 

486 

487 See Also 

488 -------- 

489 numpy.var 

490 

491 Notes 

492 ----- 

493 This is the same as `ndarray.var`, except that where an `ndarray` would 

494 be returned, a `matrix` object is returned instead. 

495 

496 Examples 

497 -------- 

498 >>> x = np.matrix(np.arange(12).reshape((3, 4))) 

499 >>> x 

500 matrix([[ 0, 1, 2, 3], 

501 [ 4, 5, 6, 7], 

502 [ 8, 9, 10, 11]]) 

503 >>> x.var() 

504 11.916666666666666 

505 >>> x.var(0) 

506 matrix([[ 10.66666667, 10.66666667, 10.66666667, 10.66666667]]) # may vary 

507 >>> x.var(1) 

508 matrix([[1.25], 

509 [1.25], 

510 [1.25]]) 

511 

512 """ 

513 return N.ndarray.var(self, axis, dtype, out, ddof, keepdims=True)._collapse(axis) 

514 

515 def prod(self, axis=None, dtype=None, out=None): 

516 """ 

517 Return the product of the array elements over the given axis. 

518 

519 Refer to `prod` for full documentation. 

520 

521 See Also 

522 -------- 

523 prod, ndarray.prod 

524 

525 Notes 

526 ----- 

527 Same as `ndarray.prod`, except, where that returns an `ndarray`, this 

528 returns a `matrix` object instead. 

529 

530 Examples 

531 -------- 

532 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

533 matrix([[ 0, 1, 2, 3], 

534 [ 4, 5, 6, 7], 

535 [ 8, 9, 10, 11]]) 

536 >>> x.prod() 

537 0 

538 >>> x.prod(0) 

539 matrix([[ 0, 45, 120, 231]]) 

540 >>> x.prod(1) 

541 matrix([[ 0], 

542 [ 840], 

543 [7920]]) 

544 

545 """ 

546 return N.ndarray.prod(self, axis, dtype, out, keepdims=True)._collapse(axis) 

547 

548 def any(self, axis=None, out=None): 

549 """ 

550 Test whether any array element along a given axis evaluates to True. 

551 

552 Refer to `numpy.any` for full documentation. 

553 

554 Parameters 

555 ---------- 

556 axis : int, optional 

557 Axis along which logical OR is performed 

558 out : ndarray, optional 

559 Output to existing array instead of creating new one, must have 

560 same shape as expected output 

561 

562 Returns 

563 ------- 

564 any : bool, ndarray 

565 Returns a single bool if `axis` is ``None``; otherwise, 

566 returns `ndarray` 

567 

568 """ 

569 return N.ndarray.any(self, axis, out, keepdims=True)._collapse(axis) 

570 

571 def all(self, axis=None, out=None): 

572 """ 

573 Test whether all matrix elements along a given axis evaluate to True. 

574 

575 Parameters 

576 ---------- 

577 See `numpy.all` for complete descriptions 

578 

579 See Also 

580 -------- 

581 numpy.all 

582 

583 Notes 

584 ----- 

585 This is the same as `ndarray.all`, but it returns a `matrix` object. 

586 

587 Examples 

588 -------- 

589 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

590 matrix([[ 0, 1, 2, 3], 

591 [ 4, 5, 6, 7], 

592 [ 8, 9, 10, 11]]) 

593 >>> y = x[0]; y 

594 matrix([[0, 1, 2, 3]]) 

595 >>> (x == y) 

596 matrix([[ True, True, True, True], 

597 [False, False, False, False], 

598 [False, False, False, False]]) 

599 >>> (x == y).all() 

600 False 

601 >>> (x == y).all(0) 

602 matrix([[False, False, False, False]]) 

603 >>> (x == y).all(1) 

604 matrix([[ True], 

605 [False], 

606 [False]]) 

607 

608 """ 

609 return N.ndarray.all(self, axis, out, keepdims=True)._collapse(axis) 

610 

611 def max(self, axis=None, out=None): 

612 """ 

613 Return the maximum value along an axis. 

614 

615 Parameters 

616 ---------- 

617 See `amax` for complete descriptions 

618 

619 See Also 

620 -------- 

621 amax, ndarray.max 

622 

623 Notes 

624 ----- 

625 This is the same as `ndarray.max`, but returns a `matrix` object 

626 where `ndarray.max` would return an ndarray. 

627 

628 Examples 

629 -------- 

630 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

631 matrix([[ 0, 1, 2, 3], 

632 [ 4, 5, 6, 7], 

633 [ 8, 9, 10, 11]]) 

634 >>> x.max() 

635 11 

636 >>> x.max(0) 

637 matrix([[ 8, 9, 10, 11]]) 

638 >>> x.max(1) 

639 matrix([[ 3], 

640 [ 7], 

641 [11]]) 

642 

643 """ 

644 return N.ndarray.max(self, axis, out, keepdims=True)._collapse(axis) 

645 

646 def argmax(self, axis=None, out=None): 

647 """ 

648 Indexes of the maximum values along an axis. 

649 

650 Return the indexes of the first occurrences of the maximum values 

651 along the specified axis. If axis is None, the index is for the 

652 flattened matrix. 

653 

654 Parameters 

655 ---------- 

656 See `numpy.argmax` for complete descriptions 

657 

658 See Also 

659 -------- 

660 numpy.argmax 

661 

662 Notes 

663 ----- 

664 This is the same as `ndarray.argmax`, but returns a `matrix` object 

665 where `ndarray.argmax` would return an `ndarray`. 

666 

667 Examples 

668 -------- 

669 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

670 matrix([[ 0, 1, 2, 3], 

671 [ 4, 5, 6, 7], 

672 [ 8, 9, 10, 11]]) 

673 >>> x.argmax() 

674 11 

675 >>> x.argmax(0) 

676 matrix([[2, 2, 2, 2]]) 

677 >>> x.argmax(1) 

678 matrix([[3], 

679 [3], 

680 [3]]) 

681 

682 """ 

683 return N.ndarray.argmax(self, axis, out)._align(axis) 

684 

685 def min(self, axis=None, out=None): 

686 """ 

687 Return the minimum value along an axis. 

688 

689 Parameters 

690 ---------- 

691 See `amin` for complete descriptions. 

692 

693 See Also 

694 -------- 

695 amin, ndarray.min 

696 

697 Notes 

698 ----- 

699 This is the same as `ndarray.min`, but returns a `matrix` object 

700 where `ndarray.min` would return an ndarray. 

701 

702 Examples 

703 -------- 

704 >>> x = -np.matrix(np.arange(12).reshape((3,4))); x 

705 matrix([[ 0, -1, -2, -3], 

706 [ -4, -5, -6, -7], 

707 [ -8, -9, -10, -11]]) 

708 >>> x.min() 

709 -11 

710 >>> x.min(0) 

711 matrix([[ -8, -9, -10, -11]]) 

712 >>> x.min(1) 

713 matrix([[ -3], 

714 [ -7], 

715 [-11]]) 

716 

717 """ 

718 return N.ndarray.min(self, axis, out, keepdims=True)._collapse(axis) 

719 

720 def argmin(self, axis=None, out=None): 

721 """ 

722 Indexes of the minimum values along an axis. 

723 

724 Return the indexes of the first occurrences of the minimum values 

725 along the specified axis. If axis is None, the index is for the 

726 flattened matrix. 

727 

728 Parameters 

729 ---------- 

730 See `numpy.argmin` for complete descriptions. 

731 

732 See Also 

733 -------- 

734 numpy.argmin 

735 

736 Notes 

737 ----- 

738 This is the same as `ndarray.argmin`, but returns a `matrix` object 

739 where `ndarray.argmin` would return an `ndarray`. 

740 

741 Examples 

742 -------- 

743 >>> x = -np.matrix(np.arange(12).reshape((3,4))); x 

744 matrix([[ 0, -1, -2, -3], 

745 [ -4, -5, -6, -7], 

746 [ -8, -9, -10, -11]]) 

747 >>> x.argmin() 

748 11 

749 >>> x.argmin(0) 

750 matrix([[2, 2, 2, 2]]) 

751 >>> x.argmin(1) 

752 matrix([[3], 

753 [3], 

754 [3]]) 

755 

756 """ 

757 return N.ndarray.argmin(self, axis, out)._align(axis) 

758 

759 def ptp(self, axis=None, out=None): 

760 """ 

761 Peak-to-peak (maximum - minimum) value along the given axis. 

762 

763 Refer to `numpy.ptp` for full documentation. 

764 

765 See Also 

766 -------- 

767 numpy.ptp 

768 

769 Notes 

770 ----- 

771 Same as `ndarray.ptp`, except, where that would return an `ndarray` object, 

772 this returns a `matrix` object. 

773 

774 Examples 

775 -------- 

776 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

777 matrix([[ 0, 1, 2, 3], 

778 [ 4, 5, 6, 7], 

779 [ 8, 9, 10, 11]]) 

780 >>> x.ptp() 

781 11 

782 >>> x.ptp(0) 

783 matrix([[8, 8, 8, 8]]) 

784 >>> x.ptp(1) 

785 matrix([[3], 

786 [3], 

787 [3]]) 

788 

789 """ 

790 return N.ndarray.ptp(self, axis, out)._align(axis) 

791 

792 @property 

793 def I(self): 

794 """ 

795 Returns the (multiplicative) inverse of invertible `self`. 

796 

797 Parameters 

798 ---------- 

799 None 

800 

801 Returns 

802 ------- 

803 ret : matrix object 

804 If `self` is non-singular, `ret` is such that ``ret * self`` == 

805 ``self * ret`` == ``np.matrix(np.eye(self[0,:].size))`` all return 

806 ``True``. 

807 

808 Raises 

809 ------ 

810 numpy.linalg.LinAlgError: Singular matrix 

811 If `self` is singular. 

812 

813 See Also 

814 -------- 

815 linalg.inv 

816 

817 Examples 

818 -------- 

819 >>> m = np.matrix('[1, 2; 3, 4]'); m 

820 matrix([[1, 2], 

821 [3, 4]]) 

822 >>> m.getI() 

823 matrix([[-2. , 1. ], 

824 [ 1.5, -0.5]]) 

825 >>> m.getI() * m 

826 matrix([[ 1., 0.], # may vary 

827 [ 0., 1.]]) 

828 

829 """ 

830 M, N = self.shape 

831 if M == N: 

832 from numpy.linalg import inv as func 

833 else: 

834 from numpy.linalg import pinv as func 

835 return asmatrix(func(self)) 

836 

837 @property 

838 def A(self): 

839 """ 

840 Return `self` as an `ndarray` object. 

841 

842 Equivalent to ``np.asarray(self)``. 

843 

844 Parameters 

845 ---------- 

846 None 

847 

848 Returns 

849 ------- 

850 ret : ndarray 

851 `self` as an `ndarray` 

852 

853 Examples 

854 -------- 

855 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

856 matrix([[ 0, 1, 2, 3], 

857 [ 4, 5, 6, 7], 

858 [ 8, 9, 10, 11]]) 

859 >>> x.getA() 

860 array([[ 0, 1, 2, 3], 

861 [ 4, 5, 6, 7], 

862 [ 8, 9, 10, 11]]) 

863 

864 """ 

865 return self.__array__() 

866 

867 @property 

868 def A1(self): 

869 """ 

870 Return `self` as a flattened `ndarray`. 

871 

872 Equivalent to ``np.asarray(x).ravel()`` 

873 

874 Parameters 

875 ---------- 

876 None 

877 

878 Returns 

879 ------- 

880 ret : ndarray 

881 `self`, 1-D, as an `ndarray` 

882 

883 Examples 

884 -------- 

885 >>> x = np.matrix(np.arange(12).reshape((3,4))); x 

886 matrix([[ 0, 1, 2, 3], 

887 [ 4, 5, 6, 7], 

888 [ 8, 9, 10, 11]]) 

889 >>> x.getA1() 

890 array([ 0, 1, 2, ..., 9, 10, 11]) 

891 

892 

893 """ 

894 return self.__array__().ravel() 

895 

896 

897 def ravel(self, order='C'): 

898 """ 

899 Return a flattened matrix. 

900 

901 Refer to `numpy.ravel` for more documentation. 

902 

903 Parameters 

904 ---------- 

905 order : {'C', 'F', 'A', 'K'}, optional 

906 The elements of `m` are read using this index order. 'C' means to 

907 index the elements in C-like order, with the last axis index 

908 changing fastest, back to the first axis index changing slowest. 

909 'F' means to index the elements in Fortran-like index order, with 

910 the first index changing fastest, and the last index changing 

911 slowest. Note that the 'C' and 'F' options take no account of the 

912 memory layout of the underlying array, and only refer to the order 

913 of axis indexing. 'A' means to read the elements in Fortran-like 

914 index order if `m` is Fortran *contiguous* in memory, C-like order 

915 otherwise. 'K' means to read the elements in the order they occur 

916 in memory, except for reversing the data when strides are negative. 

917 By default, 'C' index order is used. 

918 

919 Returns 

920 ------- 

921 ret : matrix 

922 Return the matrix flattened to shape `(1, N)` where `N` 

923 is the number of elements in the original matrix. 

924 A copy is made only if necessary. 

925 

926 See Also 

927 -------- 

928 matrix.flatten : returns a similar output matrix but always a copy 

929 matrix.flat : a flat iterator on the array. 

930 numpy.ravel : related function which returns an ndarray 

931 

932 """ 

933 return N.ndarray.ravel(self, order=order) 

934 

935 @property 

936 def T(self): 

937 """ 

938 Returns the transpose of the matrix. 

939 

940 Does *not* conjugate! For the complex conjugate transpose, use ``.H``. 

941 

942 Parameters 

943 ---------- 

944 None 

945 

946 Returns 

947 ------- 

948 ret : matrix object 

949 The (non-conjugated) transpose of the matrix. 

950 

951 See Also 

952 -------- 

953 transpose, getH 

954 

955 Examples 

956 -------- 

957 >>> m = np.matrix('[1, 2; 3, 4]') 

958 >>> m 

959 matrix([[1, 2], 

960 [3, 4]]) 

961 >>> m.getT() 

962 matrix([[1, 3], 

963 [2, 4]]) 

964 

965 """ 

966 return self.transpose() 

967 

968 @property 

969 def H(self): 

970 """ 

971 Returns the (complex) conjugate transpose of `self`. 

972 

973 Equivalent to ``np.transpose(self)`` if `self` is real-valued. 

974 

975 Parameters 

976 ---------- 

977 None 

978 

979 Returns 

980 ------- 

981 ret : matrix object 

982 complex conjugate transpose of `self` 

983 

984 Examples 

985 -------- 

986 >>> x = np.matrix(np.arange(12).reshape((3,4))) 

987 >>> z = x - 1j*x; z 

988 matrix([[ 0. +0.j, 1. -1.j, 2. -2.j, 3. -3.j], 

989 [ 4. -4.j, 5. -5.j, 6. -6.j, 7. -7.j], 

990 [ 8. -8.j, 9. -9.j, 10.-10.j, 11.-11.j]]) 

991 >>> z.getH() 

992 matrix([[ 0. -0.j, 4. +4.j, 8. +8.j], 

993 [ 1. +1.j, 5. +5.j, 9. +9.j], 

994 [ 2. +2.j, 6. +6.j, 10.+10.j], 

995 [ 3. +3.j, 7. +7.j, 11.+11.j]]) 

996 

997 """ 

998 if issubclass(self.dtype.type, N.complexfloating): 

999 return self.transpose().conjugate() 

1000 else: 

1001 return self.transpose() 

1002 

1003 # kept for compatibility 

1004 getT = T.fget 

1005 getA = A.fget 

1006 getA1 = A1.fget 

1007 getH = H.fget 

1008 getI = I.fget 

1009 

1010def _from_string(str, gdict, ldict): 

1011 rows = str.split(';') 

1012 rowtup = [] 

1013 for row in rows: 

1014 trow = row.split(',') 

1015 newrow = [] 

1016 for x in trow: 

1017 newrow.extend(x.split()) 

1018 trow = newrow 

1019 coltup = [] 

1020 for col in trow: 

1021 col = col.strip() 

1022 try: 

1023 thismat = ldict[col] 

1024 except KeyError: 

1025 try: 

1026 thismat = gdict[col] 

1027 except KeyError as e: 

1028 raise NameError(f"name {col!r} is not defined") from None 

1029 

1030 coltup.append(thismat) 

1031 rowtup.append(concatenate(coltup, axis=-1)) 

1032 return concatenate(rowtup, axis=0) 

1033 

1034 

1035@set_module('numpy') 

1036def bmat(obj, ldict=None, gdict=None): 

1037 """ 

1038 Build a matrix object from a string, nested sequence, or array. 

1039 

1040 Parameters 

1041 ---------- 

1042 obj : str or array_like 

1043 Input data. If a string, variables in the current scope may be 

1044 referenced by name. 

1045 ldict : dict, optional 

1046 A dictionary that replaces local operands in current frame. 

1047 Ignored if `obj` is not a string or `gdict` is None. 

1048 gdict : dict, optional 

1049 A dictionary that replaces global operands in current frame. 

1050 Ignored if `obj` is not a string. 

1051 

1052 Returns 

1053 ------- 

1054 out : matrix 

1055 Returns a matrix object, which is a specialized 2-D array. 

1056 

1057 See Also 

1058 -------- 

1059 block : 

1060 A generalization of this function for N-d arrays, that returns normal 

1061 ndarrays. 

1062 

1063 Examples 

1064 -------- 

1065 >>> A = np.mat('1 1; 1 1') 

1066 >>> B = np.mat('2 2; 2 2') 

1067 >>> C = np.mat('3 4; 5 6') 

1068 >>> D = np.mat('7 8; 9 0') 

1069 

1070 All the following expressions construct the same block matrix: 

1071 

1072 >>> np.bmat([[A, B], [C, D]]) 

1073 matrix([[1, 1, 2, 2], 

1074 [1, 1, 2, 2], 

1075 [3, 4, 7, 8], 

1076 [5, 6, 9, 0]]) 

1077 >>> np.bmat(np.r_[np.c_[A, B], np.c_[C, D]]) 

1078 matrix([[1, 1, 2, 2], 

1079 [1, 1, 2, 2], 

1080 [3, 4, 7, 8], 

1081 [5, 6, 9, 0]]) 

1082 >>> np.bmat('A,B; C,D') 

1083 matrix([[1, 1, 2, 2], 

1084 [1, 1, 2, 2], 

1085 [3, 4, 7, 8], 

1086 [5, 6, 9, 0]]) 

1087 

1088 """ 

1089 if isinstance(obj, str): 

1090 if gdict is None: 

1091 # get previous frame 

1092 frame = sys._getframe().f_back 

1093 glob_dict = frame.f_globals 

1094 loc_dict = frame.f_locals 

1095 else: 

1096 glob_dict = gdict 

1097 loc_dict = ldict 

1098 

1099 return matrix(_from_string(obj, glob_dict, loc_dict)) 

1100 

1101 if isinstance(obj, (tuple, list)): 

1102 # [[A,B],[C,D]] 

1103 arr_rows = [] 

1104 for row in obj: 

1105 if isinstance(row, N.ndarray): # not 2-d 

1106 return matrix(concatenate(obj, axis=-1)) 

1107 else: 

1108 arr_rows.append(concatenate(row, axis=-1)) 

1109 return matrix(concatenate(arr_rows, axis=0)) 

1110 if isinstance(obj, N.ndarray): 

1111 return matrix(obj) 

1112 

1113mat = asmatrix