Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.9/dist-packages/numpy/lib/twodim_base.py: 30%
178 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-03 06:39 +0000
« prev ^ index » next coverage.py v7.4.4, created at 2024-04-03 06:39 +0000
1""" Basic functions for manipulating 2d arrays
3"""
4import functools
5import operator
7from numpy.core.numeric import (
8 asanyarray, arange, zeros, greater_equal, multiply, ones,
9 asarray, where, int8, int16, int32, int64, intp, empty, promote_types,
10 diagonal, nonzero, indices
11 )
12from numpy.core.overrides import set_array_function_like_doc, set_module
13from numpy.core import overrides
14from numpy.core import iinfo
15from numpy.lib.stride_tricks import broadcast_to
18__all__ = [
19 'diag', 'diagflat', 'eye', 'fliplr', 'flipud', 'tri', 'triu',
20 'tril', 'vander', 'histogram2d', 'mask_indices', 'tril_indices',
21 'tril_indices_from', 'triu_indices', 'triu_indices_from', ]
24array_function_dispatch = functools.partial(
25 overrides.array_function_dispatch, module='numpy')
28i1 = iinfo(int8)
29i2 = iinfo(int16)
30i4 = iinfo(int32)
33def _min_int(low, high):
34 """ get small int that fits the range """
35 if high <= i1.max and low >= i1.min:
36 return int8
37 if high <= i2.max and low >= i2.min:
38 return int16
39 if high <= i4.max and low >= i4.min:
40 return int32
41 return int64
44def _flip_dispatcher(m):
45 return (m,)
48@array_function_dispatch(_flip_dispatcher)
49def fliplr(m):
50 """
51 Reverse the order of elements along axis 1 (left/right).
53 For a 2-D array, this flips the entries in each row in the left/right
54 direction. Columns are preserved, but appear in a different order than
55 before.
57 Parameters
58 ----------
59 m : array_like
60 Input array, must be at least 2-D.
62 Returns
63 -------
64 f : ndarray
65 A view of `m` with the columns reversed. Since a view
66 is returned, this operation is :math:`\\mathcal O(1)`.
68 See Also
69 --------
70 flipud : Flip array in the up/down direction.
71 flip : Flip array in one or more dimensions.
72 rot90 : Rotate array counterclockwise.
74 Notes
75 -----
76 Equivalent to ``m[:,::-1]`` or ``np.flip(m, axis=1)``.
77 Requires the array to be at least 2-D.
79 Examples
80 --------
81 >>> A = np.diag([1.,2.,3.])
82 >>> A
83 array([[1., 0., 0.],
84 [0., 2., 0.],
85 [0., 0., 3.]])
86 >>> np.fliplr(A)
87 array([[0., 0., 1.],
88 [0., 2., 0.],
89 [3., 0., 0.]])
91 >>> A = np.random.randn(2,3,5)
92 >>> np.all(np.fliplr(A) == A[:,::-1,...])
93 True
95 """
96 m = asanyarray(m)
97 if m.ndim < 2:
98 raise ValueError("Input must be >= 2-d.")
99 return m[:, ::-1]
102@array_function_dispatch(_flip_dispatcher)
103def flipud(m):
104 """
105 Reverse the order of elements along axis 0 (up/down).
107 For a 2-D array, this flips the entries in each column in the up/down
108 direction. Rows are preserved, but appear in a different order than before.
110 Parameters
111 ----------
112 m : array_like
113 Input array.
115 Returns
116 -------
117 out : array_like
118 A view of `m` with the rows reversed. Since a view is
119 returned, this operation is :math:`\\mathcal O(1)`.
121 See Also
122 --------
123 fliplr : Flip array in the left/right direction.
124 flip : Flip array in one or more dimensions.
125 rot90 : Rotate array counterclockwise.
127 Notes
128 -----
129 Equivalent to ``m[::-1, ...]`` or ``np.flip(m, axis=0)``.
130 Requires the array to be at least 1-D.
132 Examples
133 --------
134 >>> A = np.diag([1.0, 2, 3])
135 >>> A
136 array([[1., 0., 0.],
137 [0., 2., 0.],
138 [0., 0., 3.]])
139 >>> np.flipud(A)
140 array([[0., 0., 3.],
141 [0., 2., 0.],
142 [1., 0., 0.]])
144 >>> A = np.random.randn(2,3,5)
145 >>> np.all(np.flipud(A) == A[::-1,...])
146 True
148 >>> np.flipud([1,2])
149 array([2, 1])
151 """
152 m = asanyarray(m)
153 if m.ndim < 1:
154 raise ValueError("Input must be >= 1-d.")
155 return m[::-1, ...]
158@set_array_function_like_doc
159@set_module('numpy')
160def eye(N, M=None, k=0, dtype=float, order='C', *, like=None):
161 """
162 Return a 2-D array with ones on the diagonal and zeros elsewhere.
164 Parameters
165 ----------
166 N : int
167 Number of rows in the output.
168 M : int, optional
169 Number of columns in the output. If None, defaults to `N`.
170 k : int, optional
171 Index of the diagonal: 0 (the default) refers to the main diagonal,
172 a positive value refers to an upper diagonal, and a negative value
173 to a lower diagonal.
174 dtype : data-type, optional
175 Data-type of the returned array.
176 order : {'C', 'F'}, optional
177 Whether the output should be stored in row-major (C-style) or
178 column-major (Fortran-style) order in memory.
180 .. versionadded:: 1.14.0
181 ${ARRAY_FUNCTION_LIKE}
183 .. versionadded:: 1.20.0
185 Returns
186 -------
187 I : ndarray of shape (N,M)
188 An array where all elements are equal to zero, except for the `k`-th
189 diagonal, whose values are equal to one.
191 See Also
192 --------
193 identity : (almost) equivalent function
194 diag : diagonal 2-D array from a 1-D array specified by the user.
196 Examples
197 --------
198 >>> np.eye(2, dtype=int)
199 array([[1, 0],
200 [0, 1]])
201 >>> np.eye(3, k=1)
202 array([[0., 1., 0.],
203 [0., 0., 1.],
204 [0., 0., 0.]])
206 """
207 if like is not None:
208 return _eye_with_like(like, N, M=M, k=k, dtype=dtype, order=order)
209 if M is None:
210 M = N
211 m = zeros((N, M), dtype=dtype, order=order)
212 if k >= M:
213 return m
214 # Ensure M and k are integers, so we don't get any surprise casting
215 # results in the expressions `M-k` and `M+1` used below. This avoids
216 # a problem with inputs with type (for example) np.uint64.
217 M = operator.index(M)
218 k = operator.index(k)
219 if k >= 0:
220 i = k
221 else:
222 i = (-k) * M
223 m[:M-k].flat[i::M+1] = 1
224 return m
227_eye_with_like = array_function_dispatch()(eye)
230def _diag_dispatcher(v, k=None):
231 return (v,)
234@array_function_dispatch(_diag_dispatcher)
235def diag(v, k=0):
236 """
237 Extract a diagonal or construct a diagonal array.
239 See the more detailed documentation for ``numpy.diagonal`` if you use this
240 function to extract a diagonal and wish to write to the resulting array;
241 whether it returns a copy or a view depends on what version of numpy you
242 are using.
244 Parameters
245 ----------
246 v : array_like
247 If `v` is a 2-D array, return a copy of its `k`-th diagonal.
248 If `v` is a 1-D array, return a 2-D array with `v` on the `k`-th
249 diagonal.
250 k : int, optional
251 Diagonal in question. The default is 0. Use `k>0` for diagonals
252 above the main diagonal, and `k<0` for diagonals below the main
253 diagonal.
255 Returns
256 -------
257 out : ndarray
258 The extracted diagonal or constructed diagonal array.
260 See Also
261 --------
262 diagonal : Return specified diagonals.
263 diagflat : Create a 2-D array with the flattened input as a diagonal.
264 trace : Sum along diagonals.
265 triu : Upper triangle of an array.
266 tril : Lower triangle of an array.
268 Examples
269 --------
270 >>> x = np.arange(9).reshape((3,3))
271 >>> x
272 array([[0, 1, 2],
273 [3, 4, 5],
274 [6, 7, 8]])
276 >>> np.diag(x)
277 array([0, 4, 8])
278 >>> np.diag(x, k=1)
279 array([1, 5])
280 >>> np.diag(x, k=-1)
281 array([3, 7])
283 >>> np.diag(np.diag(x))
284 array([[0, 0, 0],
285 [0, 4, 0],
286 [0, 0, 8]])
288 """
289 v = asanyarray(v)
290 s = v.shape
291 if len(s) == 1:
292 n = s[0]+abs(k)
293 res = zeros((n, n), v.dtype)
294 if k >= 0:
295 i = k
296 else:
297 i = (-k) * n
298 res[:n-k].flat[i::n+1] = v
299 return res
300 elif len(s) == 2:
301 return diagonal(v, k)
302 else:
303 raise ValueError("Input must be 1- or 2-d.")
306@array_function_dispatch(_diag_dispatcher)
307def diagflat(v, k=0):
308 """
309 Create a two-dimensional array with the flattened input as a diagonal.
311 Parameters
312 ----------
313 v : array_like
314 Input data, which is flattened and set as the `k`-th
315 diagonal of the output.
316 k : int, optional
317 Diagonal to set; 0, the default, corresponds to the "main" diagonal,
318 a positive (negative) `k` giving the number of the diagonal above
319 (below) the main.
321 Returns
322 -------
323 out : ndarray
324 The 2-D output array.
326 See Also
327 --------
328 diag : MATLAB work-alike for 1-D and 2-D arrays.
329 diagonal : Return specified diagonals.
330 trace : Sum along diagonals.
332 Examples
333 --------
334 >>> np.diagflat([[1,2], [3,4]])
335 array([[1, 0, 0, 0],
336 [0, 2, 0, 0],
337 [0, 0, 3, 0],
338 [0, 0, 0, 4]])
340 >>> np.diagflat([1,2], 1)
341 array([[0, 1, 0],
342 [0, 0, 2],
343 [0, 0, 0]])
345 """
346 try:
347 wrap = v.__array_wrap__
348 except AttributeError:
349 wrap = None
350 v = asarray(v).ravel()
351 s = len(v)
352 n = s + abs(k)
353 res = zeros((n, n), v.dtype)
354 if (k >= 0):
355 i = arange(0, n-k, dtype=intp)
356 fi = i+k+i*n
357 else:
358 i = arange(0, n+k, dtype=intp)
359 fi = i+(i-k)*n
360 res.flat[fi] = v
361 if not wrap:
362 return res
363 return wrap(res)
366@set_array_function_like_doc
367@set_module('numpy')
368def tri(N, M=None, k=0, dtype=float, *, like=None):
369 """
370 An array with ones at and below the given diagonal and zeros elsewhere.
372 Parameters
373 ----------
374 N : int
375 Number of rows in the array.
376 M : int, optional
377 Number of columns in the array.
378 By default, `M` is taken equal to `N`.
379 k : int, optional
380 The sub-diagonal at and below which the array is filled.
381 `k` = 0 is the main diagonal, while `k` < 0 is below it,
382 and `k` > 0 is above. The default is 0.
383 dtype : dtype, optional
384 Data type of the returned array. The default is float.
385 ${ARRAY_FUNCTION_LIKE}
387 .. versionadded:: 1.20.0
389 Returns
390 -------
391 tri : ndarray of shape (N, M)
392 Array with its lower triangle filled with ones and zero elsewhere;
393 in other words ``T[i,j] == 1`` for ``j <= i + k``, 0 otherwise.
395 Examples
396 --------
397 >>> np.tri(3, 5, 2, dtype=int)
398 array([[1, 1, 1, 0, 0],
399 [1, 1, 1, 1, 0],
400 [1, 1, 1, 1, 1]])
402 >>> np.tri(3, 5, -1)
403 array([[0., 0., 0., 0., 0.],
404 [1., 0., 0., 0., 0.],
405 [1., 1., 0., 0., 0.]])
407 """
408 if like is not None:
409 return _tri_with_like(like, N, M=M, k=k, dtype=dtype)
411 if M is None:
412 M = N
414 m = greater_equal.outer(arange(N, dtype=_min_int(0, N)),
415 arange(-k, M-k, dtype=_min_int(-k, M - k)))
417 # Avoid making a copy if the requested type is already bool
418 m = m.astype(dtype, copy=False)
420 return m
423_tri_with_like = array_function_dispatch()(tri)
426def _trilu_dispatcher(m, k=None):
427 return (m,)
430@array_function_dispatch(_trilu_dispatcher)
431def tril(m, k=0):
432 """
433 Lower triangle of an array.
435 Return a copy of an array with elements above the `k`-th diagonal zeroed.
436 For arrays with ``ndim`` exceeding 2, `tril` will apply to the final two
437 axes.
439 Parameters
440 ----------
441 m : array_like, shape (..., M, N)
442 Input array.
443 k : int, optional
444 Diagonal above which to zero elements. `k = 0` (the default) is the
445 main diagonal, `k < 0` is below it and `k > 0` is above.
447 Returns
448 -------
449 tril : ndarray, shape (..., M, N)
450 Lower triangle of `m`, of same shape and data-type as `m`.
452 See Also
453 --------
454 triu : same thing, only for the upper triangle
456 Examples
457 --------
458 >>> np.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
459 array([[ 0, 0, 0],
460 [ 4, 0, 0],
461 [ 7, 8, 0],
462 [10, 11, 12]])
464 >>> np.tril(np.arange(3*4*5).reshape(3, 4, 5))
465 array([[[ 0, 0, 0, 0, 0],
466 [ 5, 6, 0, 0, 0],
467 [10, 11, 12, 0, 0],
468 [15, 16, 17, 18, 0]],
469 [[20, 0, 0, 0, 0],
470 [25, 26, 0, 0, 0],
471 [30, 31, 32, 0, 0],
472 [35, 36, 37, 38, 0]],
473 [[40, 0, 0, 0, 0],
474 [45, 46, 0, 0, 0],
475 [50, 51, 52, 0, 0],
476 [55, 56, 57, 58, 0]]])
478 """
479 m = asanyarray(m)
480 mask = tri(*m.shape[-2:], k=k, dtype=bool)
482 return where(mask, m, zeros(1, m.dtype))
485@array_function_dispatch(_trilu_dispatcher)
486def triu(m, k=0):
487 """
488 Upper triangle of an array.
490 Return a copy of an array with the elements below the `k`-th diagonal
491 zeroed. For arrays with ``ndim`` exceeding 2, `triu` will apply to the
492 final two axes.
494 Please refer to the documentation for `tril` for further details.
496 See Also
497 --------
498 tril : lower triangle of an array
500 Examples
501 --------
502 >>> np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)
503 array([[ 1, 2, 3],
504 [ 4, 5, 6],
505 [ 0, 8, 9],
506 [ 0, 0, 12]])
508 >>> np.triu(np.arange(3*4*5).reshape(3, 4, 5))
509 array([[[ 0, 1, 2, 3, 4],
510 [ 0, 6, 7, 8, 9],
511 [ 0, 0, 12, 13, 14],
512 [ 0, 0, 0, 18, 19]],
513 [[20, 21, 22, 23, 24],
514 [ 0, 26, 27, 28, 29],
515 [ 0, 0, 32, 33, 34],
516 [ 0, 0, 0, 38, 39]],
517 [[40, 41, 42, 43, 44],
518 [ 0, 46, 47, 48, 49],
519 [ 0, 0, 52, 53, 54],
520 [ 0, 0, 0, 58, 59]]])
522 """
523 m = asanyarray(m)
524 mask = tri(*m.shape[-2:], k=k-1, dtype=bool)
526 return where(mask, zeros(1, m.dtype), m)
529def _vander_dispatcher(x, N=None, increasing=None):
530 return (x,)
533# Originally borrowed from John Hunter and matplotlib
534@array_function_dispatch(_vander_dispatcher)
535def vander(x, N=None, increasing=False):
536 """
537 Generate a Vandermonde matrix.
539 The columns of the output matrix are powers of the input vector. The
540 order of the powers is determined by the `increasing` boolean argument.
541 Specifically, when `increasing` is False, the `i`-th output column is
542 the input vector raised element-wise to the power of ``N - i - 1``. Such
543 a matrix with a geometric progression in each row is named for Alexandre-
544 Theophile Vandermonde.
546 Parameters
547 ----------
548 x : array_like
549 1-D input array.
550 N : int, optional
551 Number of columns in the output. If `N` is not specified, a square
552 array is returned (``N = len(x)``).
553 increasing : bool, optional
554 Order of the powers of the columns. If True, the powers increase
555 from left to right, if False (the default) they are reversed.
557 .. versionadded:: 1.9.0
559 Returns
560 -------
561 out : ndarray
562 Vandermonde matrix. If `increasing` is False, the first column is
563 ``x^(N-1)``, the second ``x^(N-2)`` and so forth. If `increasing` is
564 True, the columns are ``x^0, x^1, ..., x^(N-1)``.
566 See Also
567 --------
568 polynomial.polynomial.polyvander
570 Examples
571 --------
572 >>> x = np.array([1, 2, 3, 5])
573 >>> N = 3
574 >>> np.vander(x, N)
575 array([[ 1, 1, 1],
576 [ 4, 2, 1],
577 [ 9, 3, 1],
578 [25, 5, 1]])
580 >>> np.column_stack([x**(N-1-i) for i in range(N)])
581 array([[ 1, 1, 1],
582 [ 4, 2, 1],
583 [ 9, 3, 1],
584 [25, 5, 1]])
586 >>> x = np.array([1, 2, 3, 5])
587 >>> np.vander(x)
588 array([[ 1, 1, 1, 1],
589 [ 8, 4, 2, 1],
590 [ 27, 9, 3, 1],
591 [125, 25, 5, 1]])
592 >>> np.vander(x, increasing=True)
593 array([[ 1, 1, 1, 1],
594 [ 1, 2, 4, 8],
595 [ 1, 3, 9, 27],
596 [ 1, 5, 25, 125]])
598 The determinant of a square Vandermonde matrix is the product
599 of the differences between the values of the input vector:
601 >>> np.linalg.det(np.vander(x))
602 48.000000000000043 # may vary
603 >>> (5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1)
604 48
606 """
607 x = asarray(x)
608 if x.ndim != 1:
609 raise ValueError("x must be a one-dimensional array or sequence.")
610 if N is None:
611 N = len(x)
613 v = empty((len(x), N), dtype=promote_types(x.dtype, int))
614 tmp = v[:, ::-1] if not increasing else v
616 if N > 0:
617 tmp[:, 0] = 1
618 if N > 1:
619 tmp[:, 1:] = x[:, None]
620 multiply.accumulate(tmp[:, 1:], out=tmp[:, 1:], axis=1)
622 return v
625def _histogram2d_dispatcher(x, y, bins=None, range=None, density=None,
626 weights=None):
627 yield x
628 yield y
630 # This terrible logic is adapted from the checks in histogram2d
631 try:
632 N = len(bins)
633 except TypeError:
634 N = 1
635 if N == 2:
636 yield from bins # bins=[x, y]
637 else:
638 yield bins
640 yield weights
643@array_function_dispatch(_histogram2d_dispatcher)
644def histogram2d(x, y, bins=10, range=None, density=None, weights=None):
645 """
646 Compute the bi-dimensional histogram of two data samples.
648 Parameters
649 ----------
650 x : array_like, shape (N,)
651 An array containing the x coordinates of the points to be
652 histogrammed.
653 y : array_like, shape (N,)
654 An array containing the y coordinates of the points to be
655 histogrammed.
656 bins : int or array_like or [int, int] or [array, array], optional
657 The bin specification:
659 * If int, the number of bins for the two dimensions (nx=ny=bins).
660 * If array_like, the bin edges for the two dimensions
661 (x_edges=y_edges=bins).
662 * If [int, int], the number of bins in each dimension
663 (nx, ny = bins).
664 * If [array, array], the bin edges in each dimension
665 (x_edges, y_edges = bins).
666 * A combination [int, array] or [array, int], where int
667 is the number of bins and array is the bin edges.
669 range : array_like, shape(2,2), optional
670 The leftmost and rightmost edges of the bins along each dimension
671 (if not specified explicitly in the `bins` parameters):
672 ``[[xmin, xmax], [ymin, ymax]]``. All values outside of this range
673 will be considered outliers and not tallied in the histogram.
674 density : bool, optional
675 If False, the default, returns the number of samples in each bin.
676 If True, returns the probability *density* function at the bin,
677 ``bin_count / sample_count / bin_area``.
678 weights : array_like, shape(N,), optional
679 An array of values ``w_i`` weighing each sample ``(x_i, y_i)``.
680 Weights are normalized to 1 if `density` is True. If `density` is
681 False, the values of the returned histogram are equal to the sum of
682 the weights belonging to the samples falling into each bin.
684 Returns
685 -------
686 H : ndarray, shape(nx, ny)
687 The bi-dimensional histogram of samples `x` and `y`. Values in `x`
688 are histogrammed along the first dimension and values in `y` are
689 histogrammed along the second dimension.
690 xedges : ndarray, shape(nx+1,)
691 The bin edges along the first dimension.
692 yedges : ndarray, shape(ny+1,)
693 The bin edges along the second dimension.
695 See Also
696 --------
697 histogram : 1D histogram
698 histogramdd : Multidimensional histogram
700 Notes
701 -----
702 When `density` is True, then the returned histogram is the sample
703 density, defined such that the sum over bins of the product
704 ``bin_value * bin_area`` is 1.
706 Please note that the histogram does not follow the Cartesian convention
707 where `x` values are on the abscissa and `y` values on the ordinate
708 axis. Rather, `x` is histogrammed along the first dimension of the
709 array (vertical), and `y` along the second dimension of the array
710 (horizontal). This ensures compatibility with `histogramdd`.
712 Examples
713 --------
714 >>> from matplotlib.image import NonUniformImage
715 >>> import matplotlib.pyplot as plt
717 Construct a 2-D histogram with variable bin width. First define the bin
718 edges:
720 >>> xedges = [0, 1, 3, 5]
721 >>> yedges = [0, 2, 3, 4, 6]
723 Next we create a histogram H with random bin content:
725 >>> x = np.random.normal(2, 1, 100)
726 >>> y = np.random.normal(1, 1, 100)
727 >>> H, xedges, yedges = np.histogram2d(x, y, bins=(xedges, yedges))
728 >>> # Histogram does not follow Cartesian convention (see Notes),
729 >>> # therefore transpose H for visualization purposes.
730 >>> H = H.T
732 :func:`imshow <matplotlib.pyplot.imshow>` can only display square bins:
734 >>> fig = plt.figure(figsize=(7, 3))
735 >>> ax = fig.add_subplot(131, title='imshow: square bins')
736 >>> plt.imshow(H, interpolation='nearest', origin='lower',
737 ... extent=[xedges[0], xedges[-1], yedges[0], yedges[-1]])
738 <matplotlib.image.AxesImage object at 0x...>
740 :func:`pcolormesh <matplotlib.pyplot.pcolormesh>` can display actual edges:
742 >>> ax = fig.add_subplot(132, title='pcolormesh: actual edges',
743 ... aspect='equal')
744 >>> X, Y = np.meshgrid(xedges, yedges)
745 >>> ax.pcolormesh(X, Y, H)
746 <matplotlib.collections.QuadMesh object at 0x...>
748 :class:`NonUniformImage <matplotlib.image.NonUniformImage>` can be used to
749 display actual bin edges with interpolation:
751 >>> ax = fig.add_subplot(133, title='NonUniformImage: interpolated',
752 ... aspect='equal', xlim=xedges[[0, -1]], ylim=yedges[[0, -1]])
753 >>> im = NonUniformImage(ax, interpolation='bilinear')
754 >>> xcenters = (xedges[:-1] + xedges[1:]) / 2
755 >>> ycenters = (yedges[:-1] + yedges[1:]) / 2
756 >>> im.set_data(xcenters, ycenters, H)
757 >>> ax.add_image(im)
758 >>> plt.show()
760 It is also possible to construct a 2-D histogram without specifying bin
761 edges:
763 >>> # Generate non-symmetric test data
764 >>> n = 10000
765 >>> x = np.linspace(1, 100, n)
766 >>> y = 2*np.log(x) + np.random.rand(n) - 0.5
767 >>> # Compute 2d histogram. Note the order of x/y and xedges/yedges
768 >>> H, yedges, xedges = np.histogram2d(y, x, bins=20)
770 Now we can plot the histogram using
771 :func:`pcolormesh <matplotlib.pyplot.pcolormesh>`, and a
772 :func:`hexbin <matplotlib.pyplot.hexbin>` for comparison.
774 >>> # Plot histogram using pcolormesh
775 >>> fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
776 >>> ax1.pcolormesh(xedges, yedges, H, cmap='rainbow')
777 >>> ax1.plot(x, 2*np.log(x), 'k-')
778 >>> ax1.set_xlim(x.min(), x.max())
779 >>> ax1.set_ylim(y.min(), y.max())
780 >>> ax1.set_xlabel('x')
781 >>> ax1.set_ylabel('y')
782 >>> ax1.set_title('histogram2d')
783 >>> ax1.grid()
785 >>> # Create hexbin plot for comparison
786 >>> ax2.hexbin(x, y, gridsize=20, cmap='rainbow')
787 >>> ax2.plot(x, 2*np.log(x), 'k-')
788 >>> ax2.set_title('hexbin')
789 >>> ax2.set_xlim(x.min(), x.max())
790 >>> ax2.set_xlabel('x')
791 >>> ax2.grid()
793 >>> plt.show()
794 """
795 from numpy import histogramdd
797 if len(x) != len(y):
798 raise ValueError('x and y must have the same length.')
800 try:
801 N = len(bins)
802 except TypeError:
803 N = 1
805 if N != 1 and N != 2:
806 xedges = yedges = asarray(bins)
807 bins = [xedges, yedges]
808 hist, edges = histogramdd([x, y], bins, range, density, weights)
809 return hist, edges[0], edges[1]
812@set_module('numpy')
813def mask_indices(n, mask_func, k=0):
814 """
815 Return the indices to access (n, n) arrays, given a masking function.
817 Assume `mask_func` is a function that, for a square array a of size
818 ``(n, n)`` with a possible offset argument `k`, when called as
819 ``mask_func(a, k)`` returns a new array with zeros in certain locations
820 (functions like `triu` or `tril` do precisely this). Then this function
821 returns the indices where the non-zero values would be located.
823 Parameters
824 ----------
825 n : int
826 The returned indices will be valid to access arrays of shape (n, n).
827 mask_func : callable
828 A function whose call signature is similar to that of `triu`, `tril`.
829 That is, ``mask_func(x, k)`` returns a boolean array, shaped like `x`.
830 `k` is an optional argument to the function.
831 k : scalar
832 An optional argument which is passed through to `mask_func`. Functions
833 like `triu`, `tril` take a second argument that is interpreted as an
834 offset.
836 Returns
837 -------
838 indices : tuple of arrays.
839 The `n` arrays of indices corresponding to the locations where
840 ``mask_func(np.ones((n, n)), k)`` is True.
842 See Also
843 --------
844 triu, tril, triu_indices, tril_indices
846 Notes
847 -----
848 .. versionadded:: 1.4.0
850 Examples
851 --------
852 These are the indices that would allow you to access the upper triangular
853 part of any 3x3 array:
855 >>> iu = np.mask_indices(3, np.triu)
857 For example, if `a` is a 3x3 array:
859 >>> a = np.arange(9).reshape(3, 3)
860 >>> a
861 array([[0, 1, 2],
862 [3, 4, 5],
863 [6, 7, 8]])
864 >>> a[iu]
865 array([0, 1, 2, 4, 5, 8])
867 An offset can be passed also to the masking function. This gets us the
868 indices starting on the first diagonal right of the main one:
870 >>> iu1 = np.mask_indices(3, np.triu, 1)
872 with which we now extract only three elements:
874 >>> a[iu1]
875 array([1, 2, 5])
877 """
878 m = ones((n, n), int)
879 a = mask_func(m, k)
880 return nonzero(a != 0)
883@set_module('numpy')
884def tril_indices(n, k=0, m=None):
885 """
886 Return the indices for the lower-triangle of an (n, m) array.
888 Parameters
889 ----------
890 n : int
891 The row dimension of the arrays for which the returned
892 indices will be valid.
893 k : int, optional
894 Diagonal offset (see `tril` for details).
895 m : int, optional
896 .. versionadded:: 1.9.0
898 The column dimension of the arrays for which the returned
899 arrays will be valid.
900 By default `m` is taken equal to `n`.
903 Returns
904 -------
905 inds : tuple of arrays
906 The indices for the triangle. The returned tuple contains two arrays,
907 each with the indices along one dimension of the array.
909 See also
910 --------
911 triu_indices : similar function, for upper-triangular.
912 mask_indices : generic function accepting an arbitrary mask function.
913 tril, triu
915 Notes
916 -----
917 .. versionadded:: 1.4.0
919 Examples
920 --------
921 Compute two different sets of indices to access 4x4 arrays, one for the
922 lower triangular part starting at the main diagonal, and one starting two
923 diagonals further right:
925 >>> il1 = np.tril_indices(4)
926 >>> il2 = np.tril_indices(4, 2)
928 Here is how they can be used with a sample array:
930 >>> a = np.arange(16).reshape(4, 4)
931 >>> a
932 array([[ 0, 1, 2, 3],
933 [ 4, 5, 6, 7],
934 [ 8, 9, 10, 11],
935 [12, 13, 14, 15]])
937 Both for indexing:
939 >>> a[il1]
940 array([ 0, 4, 5, ..., 13, 14, 15])
942 And for assigning values:
944 >>> a[il1] = -1
945 >>> a
946 array([[-1, 1, 2, 3],
947 [-1, -1, 6, 7],
948 [-1, -1, -1, 11],
949 [-1, -1, -1, -1]])
951 These cover almost the whole array (two diagonals right of the main one):
953 >>> a[il2] = -10
954 >>> a
955 array([[-10, -10, -10, 3],
956 [-10, -10, -10, -10],
957 [-10, -10, -10, -10],
958 [-10, -10, -10, -10]])
960 """
961 tri_ = tri(n, m, k=k, dtype=bool)
963 return tuple(broadcast_to(inds, tri_.shape)[tri_]
964 for inds in indices(tri_.shape, sparse=True))
967def _trilu_indices_form_dispatcher(arr, k=None):
968 return (arr,)
971@array_function_dispatch(_trilu_indices_form_dispatcher)
972def tril_indices_from(arr, k=0):
973 """
974 Return the indices for the lower-triangle of arr.
976 See `tril_indices` for full details.
978 Parameters
979 ----------
980 arr : array_like
981 The indices will be valid for square arrays whose dimensions are
982 the same as arr.
983 k : int, optional
984 Diagonal offset (see `tril` for details).
986 Examples
987 --------
989 Create a 4 by 4 array.
991 >>> a = np.arange(16).reshape(4, 4)
992 >>> a
993 array([[ 0, 1, 2, 3],
994 [ 4, 5, 6, 7],
995 [ 8, 9, 10, 11],
996 [12, 13, 14, 15]])
998 Pass the array to get the indices of the lower triangular elements.
1000 >>> trili = np.tril_indices_from(a)
1001 >>> trili
1002 (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
1004 >>> a[trili]
1005 array([ 0, 4, 5, 8, 9, 10, 12, 13, 14, 15])
1007 This is syntactic sugar for tril_indices().
1009 >>> np.tril_indices(a.shape[0])
1010 (array([0, 1, 1, 2, 2, 2, 3, 3, 3, 3]), array([0, 0, 1, 0, 1, 2, 0, 1, 2, 3]))
1012 Use the `k` parameter to return the indices for the lower triangular array
1013 up to the k-th diagonal.
1015 >>> trili1 = np.tril_indices_from(a, k=1)
1016 >>> a[trili1]
1017 array([ 0, 1, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15])
1019 See Also
1020 --------
1021 tril_indices, tril, triu_indices_from
1023 Notes
1024 -----
1025 .. versionadded:: 1.4.0
1027 """
1028 if arr.ndim != 2:
1029 raise ValueError("input array must be 2-d")
1030 return tril_indices(arr.shape[-2], k=k, m=arr.shape[-1])
1033@set_module('numpy')
1034def triu_indices(n, k=0, m=None):
1035 """
1036 Return the indices for the upper-triangle of an (n, m) array.
1038 Parameters
1039 ----------
1040 n : int
1041 The size of the arrays for which the returned indices will
1042 be valid.
1043 k : int, optional
1044 Diagonal offset (see `triu` for details).
1045 m : int, optional
1046 .. versionadded:: 1.9.0
1048 The column dimension of the arrays for which the returned
1049 arrays will be valid.
1050 By default `m` is taken equal to `n`.
1053 Returns
1054 -------
1055 inds : tuple, shape(2) of ndarrays, shape(`n`)
1056 The indices for the triangle. The returned tuple contains two arrays,
1057 each with the indices along one dimension of the array. Can be used
1058 to slice a ndarray of shape(`n`, `n`).
1060 See also
1061 --------
1062 tril_indices : similar function, for lower-triangular.
1063 mask_indices : generic function accepting an arbitrary mask function.
1064 triu, tril
1066 Notes
1067 -----
1068 .. versionadded:: 1.4.0
1070 Examples
1071 --------
1072 Compute two different sets of indices to access 4x4 arrays, one for the
1073 upper triangular part starting at the main diagonal, and one starting two
1074 diagonals further right:
1076 >>> iu1 = np.triu_indices(4)
1077 >>> iu2 = np.triu_indices(4, 2)
1079 Here is how they can be used with a sample array:
1081 >>> a = np.arange(16).reshape(4, 4)
1082 >>> a
1083 array([[ 0, 1, 2, 3],
1084 [ 4, 5, 6, 7],
1085 [ 8, 9, 10, 11],
1086 [12, 13, 14, 15]])
1088 Both for indexing:
1090 >>> a[iu1]
1091 array([ 0, 1, 2, ..., 10, 11, 15])
1093 And for assigning values:
1095 >>> a[iu1] = -1
1096 >>> a
1097 array([[-1, -1, -1, -1],
1098 [ 4, -1, -1, -1],
1099 [ 8, 9, -1, -1],
1100 [12, 13, 14, -1]])
1102 These cover only a small part of the whole array (two diagonals right
1103 of the main one):
1105 >>> a[iu2] = -10
1106 >>> a
1107 array([[ -1, -1, -10, -10],
1108 [ 4, -1, -1, -10],
1109 [ 8, 9, -1, -1],
1110 [ 12, 13, 14, -1]])
1112 """
1113 tri_ = ~tri(n, m, k=k - 1, dtype=bool)
1115 return tuple(broadcast_to(inds, tri_.shape)[tri_]
1116 for inds in indices(tri_.shape, sparse=True))
1119@array_function_dispatch(_trilu_indices_form_dispatcher)
1120def triu_indices_from(arr, k=0):
1121 """
1122 Return the indices for the upper-triangle of arr.
1124 See `triu_indices` for full details.
1126 Parameters
1127 ----------
1128 arr : ndarray, shape(N, N)
1129 The indices will be valid for square arrays.
1130 k : int, optional
1131 Diagonal offset (see `triu` for details).
1133 Returns
1134 -------
1135 triu_indices_from : tuple, shape(2) of ndarray, shape(N)
1136 Indices for the upper-triangle of `arr`.
1138 Examples
1139 --------
1141 Create a 4 by 4 array.
1143 >>> a = np.arange(16).reshape(4, 4)
1144 >>> a
1145 array([[ 0, 1, 2, 3],
1146 [ 4, 5, 6, 7],
1147 [ 8, 9, 10, 11],
1148 [12, 13, 14, 15]])
1150 Pass the array to get the indices of the upper triangular elements.
1152 >>> triui = np.triu_indices_from(a)
1153 >>> triui
1154 (array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3]), array([0, 1, 2, 3, 1, 2, 3, 2, 3, 3]))
1156 >>> a[triui]
1157 array([ 0, 1, 2, 3, 5, 6, 7, 10, 11, 15])
1159 This is syntactic sugar for triu_indices().
1161 >>> np.triu_indices(a.shape[0])
1162 (array([0, 0, 0, 0, 1, 1, 1, 2, 2, 3]), array([0, 1, 2, 3, 1, 2, 3, 2, 3, 3]))
1164 Use the `k` parameter to return the indices for the upper triangular array
1165 from the k-th diagonal.
1167 >>> triuim1 = np.triu_indices_from(a, k=1)
1168 >>> a[triuim1]
1169 array([ 1, 2, 3, 6, 7, 11])
1172 See Also
1173 --------
1174 triu_indices, triu, tril_indices_from
1176 Notes
1177 -----
1178 .. versionadded:: 1.4.0
1180 """
1181 if arr.ndim != 2:
1182 raise ValueError("input array must be 2-d")
1183 return triu_indices(arr.shape[-2], k=k, m=arr.shape[-1])