1import functools
2import itertools
3import operator
4import sys
5import warnings
6import numbers
7import builtins
8
9import numpy as np
10from . import multiarray
11from .multiarray import (
12 fastCopyAndTranspose, ALLOW_THREADS,
13 BUFSIZE, CLIP, MAXDIMS, MAY_SHARE_BOUNDS, MAY_SHARE_EXACT, RAISE,
14 WRAP, arange, array, asarray, asanyarray, ascontiguousarray,
15 asfortranarray, broadcast, can_cast, compare_chararrays,
16 concatenate, copyto, dot, dtype, empty,
17 empty_like, flatiter, frombuffer, from_dlpack, fromfile, fromiter,
18 fromstring, inner, lexsort, matmul, may_share_memory,
19 min_scalar_type, ndarray, nditer, nested_iters, promote_types,
20 putmask, result_type, set_numeric_ops, shares_memory, vdot, where,
21 zeros, normalize_axis_index, _get_promotion_state, _set_promotion_state,
22 _using_numpy2_behavior)
23
24from . import overrides
25from . import umath
26from . import shape_base
27from .overrides import set_array_function_like_doc, set_module
28from .umath import (multiply, invert, sin, PINF, NAN)
29from . import numerictypes
30from .numerictypes import longlong, intc, int_, float_, complex_, bool_
31from ..exceptions import ComplexWarning, TooHardError, AxisError
32from ._ufunc_config import errstate, _no_nep50_warning
33
34bitwise_not = invert
35ufunc = type(sin)
36newaxis = None
37
38array_function_dispatch = functools.partial(
39 overrides.array_function_dispatch, module='numpy')
40
41
42__all__ = [
43 'newaxis', 'ndarray', 'flatiter', 'nditer', 'nested_iters', 'ufunc',
44 'arange', 'array', 'asarray', 'asanyarray', 'ascontiguousarray',
45 'asfortranarray', 'zeros', 'count_nonzero', 'empty', 'broadcast', 'dtype',
46 'fromstring', 'fromfile', 'frombuffer', 'from_dlpack', 'where',
47 'argwhere', 'copyto', 'concatenate', 'fastCopyAndTranspose', 'lexsort',
48 'set_numeric_ops', 'can_cast', 'promote_types', 'min_scalar_type',
49 'result_type', 'isfortran', 'empty_like', 'zeros_like', 'ones_like',
50 'correlate', 'convolve', 'inner', 'dot', 'outer', 'vdot', 'roll',
51 'rollaxis', 'moveaxis', 'cross', 'tensordot', 'little_endian',
52 'fromiter', 'array_equal', 'array_equiv', 'indices', 'fromfunction',
53 'isclose', 'isscalar', 'binary_repr', 'base_repr', 'ones',
54 'identity', 'allclose', 'compare_chararrays', 'putmask',
55 'flatnonzero', 'Inf', 'inf', 'infty', 'Infinity', 'nan', 'NaN',
56 'False_', 'True_', 'bitwise_not', 'CLIP', 'RAISE', 'WRAP', 'MAXDIMS',
57 'BUFSIZE', 'ALLOW_THREADS', 'full', 'full_like',
58 'matmul', 'shares_memory', 'may_share_memory', 'MAY_SHARE_BOUNDS',
59 'MAY_SHARE_EXACT', '_get_promotion_state', '_set_promotion_state',
60 '_using_numpy2_behavior']
61
62
63def _zeros_like_dispatcher(a, dtype=None, order=None, subok=None, shape=None):
64 return (a,)
65
66
67@array_function_dispatch(_zeros_like_dispatcher)
68def zeros_like(a, dtype=None, order='K', subok=True, shape=None):
69 """
70 Return an array of zeros with the same shape and type as a given array.
71
72 Parameters
73 ----------
74 a : array_like
75 The shape and data-type of `a` define these same attributes of
76 the returned array.
77 dtype : data-type, optional
78 Overrides the data type of the result.
79
80 .. versionadded:: 1.6.0
81 order : {'C', 'F', 'A', or 'K'}, optional
82 Overrides the memory layout of the result. 'C' means C-order,
83 'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
84 'C' otherwise. 'K' means match the layout of `a` as closely
85 as possible.
86
87 .. versionadded:: 1.6.0
88 subok : bool, optional.
89 If True, then the newly created array will use the sub-class
90 type of `a`, otherwise it will be a base-class array. Defaults
91 to True.
92 shape : int or sequence of ints, optional.
93 Overrides the shape of the result. If order='K' and the number of
94 dimensions is unchanged, will try to keep order, otherwise,
95 order='C' is implied.
96
97 .. versionadded:: 1.17.0
98
99 Returns
100 -------
101 out : ndarray
102 Array of zeros with the same shape and type as `a`.
103
104 See Also
105 --------
106 empty_like : Return an empty array with shape and type of input.
107 ones_like : Return an array of ones with shape and type of input.
108 full_like : Return a new array with shape of input filled with value.
109 zeros : Return a new array setting values to zero.
110
111 Examples
112 --------
113 >>> x = np.arange(6)
114 >>> x = x.reshape((2, 3))
115 >>> x
116 array([[0, 1, 2],
117 [3, 4, 5]])
118 >>> np.zeros_like(x)
119 array([[0, 0, 0],
120 [0, 0, 0]])
121
122 >>> y = np.arange(3, dtype=float)
123 >>> y
124 array([0., 1., 2.])
125 >>> np.zeros_like(y)
126 array([0., 0., 0.])
127
128 """
129 res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
130 # needed instead of a 0 to get same result as zeros for string dtypes
131 z = zeros(1, dtype=res.dtype)
132 multiarray.copyto(res, z, casting='unsafe')
133 return res
134
135
136@set_array_function_like_doc
137@set_module('numpy')
138def ones(shape, dtype=None, order='C', *, like=None):
139 """
140 Return a new array of given shape and type, filled with ones.
141
142 Parameters
143 ----------
144 shape : int or sequence of ints
145 Shape of the new array, e.g., ``(2, 3)`` or ``2``.
146 dtype : data-type, optional
147 The desired data-type for the array, e.g., `numpy.int8`. Default is
148 `numpy.float64`.
149 order : {'C', 'F'}, optional, default: C
150 Whether to store multi-dimensional data in row-major
151 (C-style) or column-major (Fortran-style) order in
152 memory.
153 ${ARRAY_FUNCTION_LIKE}
154
155 .. versionadded:: 1.20.0
156
157 Returns
158 -------
159 out : ndarray
160 Array of ones with the given shape, dtype, and order.
161
162 See Also
163 --------
164 ones_like : Return an array of ones with shape and type of input.
165 empty : Return a new uninitialized array.
166 zeros : Return a new array setting values to zero.
167 full : Return a new array of given shape filled with value.
168
169
170 Examples
171 --------
172 >>> np.ones(5)
173 array([1., 1., 1., 1., 1.])
174
175 >>> np.ones((5,), dtype=int)
176 array([1, 1, 1, 1, 1])
177
178 >>> np.ones((2, 1))
179 array([[1.],
180 [1.]])
181
182 >>> s = (2,2)
183 >>> np.ones(s)
184 array([[1., 1.],
185 [1., 1.]])
186
187 """
188 if like is not None:
189 return _ones_with_like(like, shape, dtype=dtype, order=order)
190
191 a = empty(shape, dtype, order)
192 multiarray.copyto(a, 1, casting='unsafe')
193 return a
194
195
196_ones_with_like = array_function_dispatch()(ones)
197
198
199def _ones_like_dispatcher(a, dtype=None, order=None, subok=None, shape=None):
200 return (a,)
201
202
203@array_function_dispatch(_ones_like_dispatcher)
204def ones_like(a, dtype=None, order='K', subok=True, shape=None):
205 """
206 Return an array of ones with the same shape and type as a given array.
207
208 Parameters
209 ----------
210 a : array_like
211 The shape and data-type of `a` define these same attributes of
212 the returned array.
213 dtype : data-type, optional
214 Overrides the data type of the result.
215
216 .. versionadded:: 1.6.0
217 order : {'C', 'F', 'A', or 'K'}, optional
218 Overrides the memory layout of the result. 'C' means C-order,
219 'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
220 'C' otherwise. 'K' means match the layout of `a` as closely
221 as possible.
222
223 .. versionadded:: 1.6.0
224 subok : bool, optional.
225 If True, then the newly created array will use the sub-class
226 type of `a`, otherwise it will be a base-class array. Defaults
227 to True.
228 shape : int or sequence of ints, optional.
229 Overrides the shape of the result. If order='K' and the number of
230 dimensions is unchanged, will try to keep order, otherwise,
231 order='C' is implied.
232
233 .. versionadded:: 1.17.0
234
235 Returns
236 -------
237 out : ndarray
238 Array of ones with the same shape and type as `a`.
239
240 See Also
241 --------
242 empty_like : Return an empty array with shape and type of input.
243 zeros_like : Return an array of zeros with shape and type of input.
244 full_like : Return a new array with shape of input filled with value.
245 ones : Return a new array setting values to one.
246
247 Examples
248 --------
249 >>> x = np.arange(6)
250 >>> x = x.reshape((2, 3))
251 >>> x
252 array([[0, 1, 2],
253 [3, 4, 5]])
254 >>> np.ones_like(x)
255 array([[1, 1, 1],
256 [1, 1, 1]])
257
258 >>> y = np.arange(3, dtype=float)
259 >>> y
260 array([0., 1., 2.])
261 >>> np.ones_like(y)
262 array([1., 1., 1.])
263
264 """
265 res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
266 multiarray.copyto(res, 1, casting='unsafe')
267 return res
268
269
270def _full_dispatcher(shape, fill_value, dtype=None, order=None, *, like=None):
271 return(like,)
272
273
274@set_array_function_like_doc
275@set_module('numpy')
276def full(shape, fill_value, dtype=None, order='C', *, like=None):
277 """
278 Return a new array of given shape and type, filled with `fill_value`.
279
280 Parameters
281 ----------
282 shape : int or sequence of ints
283 Shape of the new array, e.g., ``(2, 3)`` or ``2``.
284 fill_value : scalar or array_like
285 Fill value.
286 dtype : data-type, optional
287 The desired data-type for the array The default, None, means
288 ``np.array(fill_value).dtype``.
289 order : {'C', 'F'}, optional
290 Whether to store multidimensional data in C- or Fortran-contiguous
291 (row- or column-wise) order in memory.
292 ${ARRAY_FUNCTION_LIKE}
293
294 .. versionadded:: 1.20.0
295
296 Returns
297 -------
298 out : ndarray
299 Array of `fill_value` with the given shape, dtype, and order.
300
301 See Also
302 --------
303 full_like : Return a new array with shape of input filled with value.
304 empty : Return a new uninitialized array.
305 ones : Return a new array setting values to one.
306 zeros : Return a new array setting values to zero.
307
308 Examples
309 --------
310 >>> np.full((2, 2), np.inf)
311 array([[inf, inf],
312 [inf, inf]])
313 >>> np.full((2, 2), 10)
314 array([[10, 10],
315 [10, 10]])
316
317 >>> np.full((2, 2), [1, 2])
318 array([[1, 2],
319 [1, 2]])
320
321 """
322 if like is not None:
323 return _full_with_like(
324 like, shape, fill_value, dtype=dtype, order=order)
325
326 if dtype is None:
327 fill_value = asarray(fill_value)
328 dtype = fill_value.dtype
329 a = empty(shape, dtype, order)
330 multiarray.copyto(a, fill_value, casting='unsafe')
331 return a
332
333
334_full_with_like = array_function_dispatch()(full)
335
336
337def _full_like_dispatcher(a, fill_value, dtype=None, order=None, subok=None, shape=None):
338 return (a,)
339
340
341@array_function_dispatch(_full_like_dispatcher)
342def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
343 """
344 Return a full array with the same shape and type as a given array.
345
346 Parameters
347 ----------
348 a : array_like
349 The shape and data-type of `a` define these same attributes of
350 the returned array.
351 fill_value : array_like
352 Fill value.
353 dtype : data-type, optional
354 Overrides the data type of the result.
355 order : {'C', 'F', 'A', or 'K'}, optional
356 Overrides the memory layout of the result. 'C' means C-order,
357 'F' means F-order, 'A' means 'F' if `a` is Fortran contiguous,
358 'C' otherwise. 'K' means match the layout of `a` as closely
359 as possible.
360 subok : bool, optional.
361 If True, then the newly created array will use the sub-class
362 type of `a`, otherwise it will be a base-class array. Defaults
363 to True.
364 shape : int or sequence of ints, optional.
365 Overrides the shape of the result. If order='K' and the number of
366 dimensions is unchanged, will try to keep order, otherwise,
367 order='C' is implied.
368
369 .. versionadded:: 1.17.0
370
371 Returns
372 -------
373 out : ndarray
374 Array of `fill_value` with the same shape and type as `a`.
375
376 See Also
377 --------
378 empty_like : Return an empty array with shape and type of input.
379 ones_like : Return an array of ones with shape and type of input.
380 zeros_like : Return an array of zeros with shape and type of input.
381 full : Return a new array of given shape filled with value.
382
383 Examples
384 --------
385 >>> x = np.arange(6, dtype=int)
386 >>> np.full_like(x, 1)
387 array([1, 1, 1, 1, 1, 1])
388 >>> np.full_like(x, 0.1)
389 array([0, 0, 0, 0, 0, 0])
390 >>> np.full_like(x, 0.1, dtype=np.double)
391 array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
392 >>> np.full_like(x, np.nan, dtype=np.double)
393 array([nan, nan, nan, nan, nan, nan])
394
395 >>> y = np.arange(6, dtype=np.double)
396 >>> np.full_like(y, 0.1)
397 array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])
398
399 >>> y = np.zeros([2, 2, 3], dtype=int)
400 >>> np.full_like(y, [0, 0, 255])
401 array([[[ 0, 0, 255],
402 [ 0, 0, 255]],
403 [[ 0, 0, 255],
404 [ 0, 0, 255]]])
405 """
406 res = empty_like(a, dtype=dtype, order=order, subok=subok, shape=shape)
407 multiarray.copyto(res, fill_value, casting='unsafe')
408 return res
409
410
411def _count_nonzero_dispatcher(a, axis=None, *, keepdims=None):
412 return (a,)
413
414
415@array_function_dispatch(_count_nonzero_dispatcher)
416def count_nonzero(a, axis=None, *, keepdims=False):
417 """
418 Counts the number of non-zero values in the array ``a``.
419
420 The word "non-zero" is in reference to the Python 2.x
421 built-in method ``__nonzero__()`` (renamed ``__bool__()``
422 in Python 3.x) of Python objects that tests an object's
423 "truthfulness". For example, any number is considered
424 truthful if it is nonzero, whereas any string is considered
425 truthful if it is not the empty string. Thus, this function
426 (recursively) counts how many elements in ``a`` (and in
427 sub-arrays thereof) have their ``__nonzero__()`` or ``__bool__()``
428 method evaluated to ``True``.
429
430 Parameters
431 ----------
432 a : array_like
433 The array for which to count non-zeros.
434 axis : int or tuple, optional
435 Axis or tuple of axes along which to count non-zeros.
436 Default is None, meaning that non-zeros will be counted
437 along a flattened version of ``a``.
438
439 .. versionadded:: 1.12.0
440
441 keepdims : bool, optional
442 If this is set to True, the axes that are counted are left
443 in the result as dimensions with size one. With this option,
444 the result will broadcast correctly against the input array.
445
446 .. versionadded:: 1.19.0
447
448 Returns
449 -------
450 count : int or array of int
451 Number of non-zero values in the array along a given axis.
452 Otherwise, the total number of non-zero values in the array
453 is returned.
454
455 See Also
456 --------
457 nonzero : Return the coordinates of all the non-zero values.
458
459 Examples
460 --------
461 >>> np.count_nonzero(np.eye(4))
462 4
463 >>> a = np.array([[0, 1, 7, 0],
464 ... [3, 0, 2, 19]])
465 >>> np.count_nonzero(a)
466 5
467 >>> np.count_nonzero(a, axis=0)
468 array([1, 1, 2, 1])
469 >>> np.count_nonzero(a, axis=1)
470 array([2, 3])
471 >>> np.count_nonzero(a, axis=1, keepdims=True)
472 array([[2],
473 [3]])
474 """
475 if axis is None and not keepdims:
476 return multiarray.count_nonzero(a)
477
478 a = asanyarray(a)
479
480 # TODO: this works around .astype(bool) not working properly (gh-9847)
481 if np.issubdtype(a.dtype, np.character):
482 a_bool = a != a.dtype.type()
483 else:
484 a_bool = a.astype(np.bool_, copy=False)
485
486 return a_bool.sum(axis=axis, dtype=np.intp, keepdims=keepdims)
487
488
489@set_module('numpy')
490def isfortran(a):
491 """
492 Check if the array is Fortran contiguous but *not* C contiguous.
493
494 This function is obsolete and, because of changes due to relaxed stride
495 checking, its return value for the same array may differ for versions
496 of NumPy >= 1.10.0 and previous versions. If you only want to check if an
497 array is Fortran contiguous use ``a.flags.f_contiguous`` instead.
498
499 Parameters
500 ----------
501 a : ndarray
502 Input array.
503
504 Returns
505 -------
506 isfortran : bool
507 Returns True if the array is Fortran contiguous but *not* C contiguous.
508
509
510 Examples
511 --------
512
513 np.array allows to specify whether the array is written in C-contiguous
514 order (last index varies the fastest), or FORTRAN-contiguous order in
515 memory (first index varies the fastest).
516
517 >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
518 >>> a
519 array([[1, 2, 3],
520 [4, 5, 6]])
521 >>> np.isfortran(a)
522 False
523
524 >>> b = np.array([[1, 2, 3], [4, 5, 6]], order='F')
525 >>> b
526 array([[1, 2, 3],
527 [4, 5, 6]])
528 >>> np.isfortran(b)
529 True
530
531
532 The transpose of a C-ordered array is a FORTRAN-ordered array.
533
534 >>> a = np.array([[1, 2, 3], [4, 5, 6]], order='C')
535 >>> a
536 array([[1, 2, 3],
537 [4, 5, 6]])
538 >>> np.isfortran(a)
539 False
540 >>> b = a.T
541 >>> b
542 array([[1, 4],
543 [2, 5],
544 [3, 6]])
545 >>> np.isfortran(b)
546 True
547
548 C-ordered arrays evaluate as False even if they are also FORTRAN-ordered.
549
550 >>> np.isfortran(np.array([1, 2], order='F'))
551 False
552
553 """
554 return a.flags.fnc
555
556
557def _argwhere_dispatcher(a):
558 return (a,)
559
560
561@array_function_dispatch(_argwhere_dispatcher)
562def argwhere(a):
563 """
564 Find the indices of array elements that are non-zero, grouped by element.
565
566 Parameters
567 ----------
568 a : array_like
569 Input data.
570
571 Returns
572 -------
573 index_array : (N, a.ndim) ndarray
574 Indices of elements that are non-zero. Indices are grouped by element.
575 This array will have shape ``(N, a.ndim)`` where ``N`` is the number of
576 non-zero items.
577
578 See Also
579 --------
580 where, nonzero
581
582 Notes
583 -----
584 ``np.argwhere(a)`` is almost the same as ``np.transpose(np.nonzero(a))``,
585 but produces a result of the correct shape for a 0D array.
586
587 The output of ``argwhere`` is not suitable for indexing arrays.
588 For this purpose use ``nonzero(a)`` instead.
589
590 Examples
591 --------
592 >>> x = np.arange(6).reshape(2,3)
593 >>> x
594 array([[0, 1, 2],
595 [3, 4, 5]])
596 >>> np.argwhere(x>1)
597 array([[0, 2],
598 [1, 0],
599 [1, 1],
600 [1, 2]])
601
602 """
603 # nonzero does not behave well on 0d, so promote to 1d
604 if np.ndim(a) == 0:
605 a = shape_base.atleast_1d(a)
606 # then remove the added dimension
607 return argwhere(a)[:,:0]
608 return transpose(nonzero(a))
609
610
611def _flatnonzero_dispatcher(a):
612 return (a,)
613
614
615@array_function_dispatch(_flatnonzero_dispatcher)
616def flatnonzero(a):
617 """
618 Return indices that are non-zero in the flattened version of a.
619
620 This is equivalent to ``np.nonzero(np.ravel(a))[0]``.
621
622 Parameters
623 ----------
624 a : array_like
625 Input data.
626
627 Returns
628 -------
629 res : ndarray
630 Output array, containing the indices of the elements of ``a.ravel()``
631 that are non-zero.
632
633 See Also
634 --------
635 nonzero : Return the indices of the non-zero elements of the input array.
636 ravel : Return a 1-D array containing the elements of the input array.
637
638 Examples
639 --------
640 >>> x = np.arange(-2, 3)
641 >>> x
642 array([-2, -1, 0, 1, 2])
643 >>> np.flatnonzero(x)
644 array([0, 1, 3, 4])
645
646 Use the indices of the non-zero elements as an index array to extract
647 these elements:
648
649 >>> x.ravel()[np.flatnonzero(x)]
650 array([-2, -1, 1, 2])
651
652 """
653 return np.nonzero(np.ravel(a))[0]
654
655
656def _correlate_dispatcher(a, v, mode=None):
657 return (a, v)
658
659
660@array_function_dispatch(_correlate_dispatcher)
661def correlate(a, v, mode='valid'):
662 r"""
663 Cross-correlation of two 1-dimensional sequences.
664
665 This function computes the correlation as generally defined in signal
666 processing texts:
667
668 .. math:: c_k = \sum_n a_{n+k} \cdot \overline{v}_n
669
670 with a and v sequences being zero-padded where necessary and
671 :math:`\overline x` denoting complex conjugation.
672
673 Parameters
674 ----------
675 a, v : array_like
676 Input sequences.
677 mode : {'valid', 'same', 'full'}, optional
678 Refer to the `convolve` docstring. Note that the default
679 is 'valid', unlike `convolve`, which uses 'full'.
680 old_behavior : bool
681 `old_behavior` was removed in NumPy 1.10. If you need the old
682 behavior, use `multiarray.correlate`.
683
684 Returns
685 -------
686 out : ndarray
687 Discrete cross-correlation of `a` and `v`.
688
689 See Also
690 --------
691 convolve : Discrete, linear convolution of two one-dimensional sequences.
692 multiarray.correlate : Old, no conjugate, version of correlate.
693 scipy.signal.correlate : uses FFT which has superior performance on large arrays.
694
695 Notes
696 -----
697 The definition of correlation above is not unique and sometimes correlation
698 may be defined differently. Another common definition is:
699
700 .. math:: c'_k = \sum_n a_{n} \cdot \overline{v_{n+k}}
701
702 which is related to :math:`c_k` by :math:`c'_k = c_{-k}`.
703
704 `numpy.correlate` may perform slowly in large arrays (i.e. n = 1e5) because it does
705 not use the FFT to compute the convolution; in that case, `scipy.signal.correlate` might
706 be preferable.
707
708
709 Examples
710 --------
711 >>> np.correlate([1, 2, 3], [0, 1, 0.5])
712 array([3.5])
713 >>> np.correlate([1, 2, 3], [0, 1, 0.5], "same")
714 array([2. , 3.5, 3. ])
715 >>> np.correlate([1, 2, 3], [0, 1, 0.5], "full")
716 array([0.5, 2. , 3.5, 3. , 0. ])
717
718 Using complex sequences:
719
720 >>> np.correlate([1+1j, 2, 3-1j], [0, 1, 0.5j], 'full')
721 array([ 0.5-0.5j, 1.0+0.j , 1.5-1.5j, 3.0-1.j , 0.0+0.j ])
722
723 Note that you get the time reversed, complex conjugated result
724 (:math:`\overline{c_{-k}}`) when the two input sequences a and v change
725 places:
726
727 >>> np.correlate([0, 1, 0.5j], [1+1j, 2, 3-1j], 'full')
728 array([ 0.0+0.j , 3.0+1.j , 1.5+1.5j, 1.0+0.j , 0.5+0.5j])
729
730 """
731 return multiarray.correlate2(a, v, mode)
732
733
734def _convolve_dispatcher(a, v, mode=None):
735 return (a, v)
736
737
738@array_function_dispatch(_convolve_dispatcher)
739def convolve(a, v, mode='full'):
740 """
741 Returns the discrete, linear convolution of two one-dimensional sequences.
742
743 The convolution operator is often seen in signal processing, where it
744 models the effect of a linear time-invariant system on a signal [1]_. In
745 probability theory, the sum of two independent random variables is
746 distributed according to the convolution of their individual
747 distributions.
748
749 If `v` is longer than `a`, the arrays are swapped before computation.
750
751 Parameters
752 ----------
753 a : (N,) array_like
754 First one-dimensional input array.
755 v : (M,) array_like
756 Second one-dimensional input array.
757 mode : {'full', 'valid', 'same'}, optional
758 'full':
759 By default, mode is 'full'. This returns the convolution
760 at each point of overlap, with an output shape of (N+M-1,). At
761 the end-points of the convolution, the signals do not overlap
762 completely, and boundary effects may be seen.
763
764 'same':
765 Mode 'same' returns output of length ``max(M, N)``. Boundary
766 effects are still visible.
767
768 'valid':
769 Mode 'valid' returns output of length
770 ``max(M, N) - min(M, N) + 1``. The convolution product is only given
771 for points where the signals overlap completely. Values outside
772 the signal boundary have no effect.
773
774 Returns
775 -------
776 out : ndarray
777 Discrete, linear convolution of `a` and `v`.
778
779 See Also
780 --------
781 scipy.signal.fftconvolve : Convolve two arrays using the Fast Fourier
782 Transform.
783 scipy.linalg.toeplitz : Used to construct the convolution operator.
784 polymul : Polynomial multiplication. Same output as convolve, but also
785 accepts poly1d objects as input.
786
787 Notes
788 -----
789 The discrete convolution operation is defined as
790
791 .. math:: (a * v)_n = \\sum_{m = -\\infty}^{\\infty} a_m v_{n - m}
792
793 It can be shown that a convolution :math:`x(t) * y(t)` in time/space
794 is equivalent to the multiplication :math:`X(f) Y(f)` in the Fourier
795 domain, after appropriate padding (padding is necessary to prevent
796 circular convolution). Since multiplication is more efficient (faster)
797 than convolution, the function `scipy.signal.fftconvolve` exploits the
798 FFT to calculate the convolution of large data-sets.
799
800 References
801 ----------
802 .. [1] Wikipedia, "Convolution",
803 https://en.wikipedia.org/wiki/Convolution
804
805 Examples
806 --------
807 Note how the convolution operator flips the second array
808 before "sliding" the two across one another:
809
810 >>> np.convolve([1, 2, 3], [0, 1, 0.5])
811 array([0. , 1. , 2.5, 4. , 1.5])
812
813 Only return the middle values of the convolution.
814 Contains boundary effects, where zeros are taken
815 into account:
816
817 >>> np.convolve([1,2,3],[0,1,0.5], 'same')
818 array([1. , 2.5, 4. ])
819
820 The two arrays are of the same length, so there
821 is only one position where they completely overlap:
822
823 >>> np.convolve([1,2,3],[0,1,0.5], 'valid')
824 array([2.5])
825
826 """
827 a, v = array(a, copy=False, ndmin=1), array(v, copy=False, ndmin=1)
828 if (len(v) > len(a)):
829 a, v = v, a
830 if len(a) == 0:
831 raise ValueError('a cannot be empty')
832 if len(v) == 0:
833 raise ValueError('v cannot be empty')
834 return multiarray.correlate(a, v[::-1], mode)
835
836
837def _outer_dispatcher(a, b, out=None):
838 return (a, b, out)
839
840
841@array_function_dispatch(_outer_dispatcher)
842def outer(a, b, out=None):
843 """
844 Compute the outer product of two vectors.
845
846 Given two vectors `a` and `b` of length ``M`` and ``N``, repsectively,
847 the outer product [1]_ is::
848
849 [[a_0*b_0 a_0*b_1 ... a_0*b_{N-1} ]
850 [a_1*b_0 .
851 [ ... .
852 [a_{M-1}*b_0 a_{M-1}*b_{N-1} ]]
853
854 Parameters
855 ----------
856 a : (M,) array_like
857 First input vector. Input is flattened if
858 not already 1-dimensional.
859 b : (N,) array_like
860 Second input vector. Input is flattened if
861 not already 1-dimensional.
862 out : (M, N) ndarray, optional
863 A location where the result is stored
864
865 .. versionadded:: 1.9.0
866
867 Returns
868 -------
869 out : (M, N) ndarray
870 ``out[i, j] = a[i] * b[j]``
871
872 See also
873 --------
874 inner
875 einsum : ``einsum('i,j->ij', a.ravel(), b.ravel())`` is the equivalent.
876 ufunc.outer : A generalization to dimensions other than 1D and other
877 operations. ``np.multiply.outer(a.ravel(), b.ravel())``
878 is the equivalent.
879 tensordot : ``np.tensordot(a.ravel(), b.ravel(), axes=((), ()))``
880 is the equivalent.
881
882 References
883 ----------
884 .. [1] G. H. Golub and C. F. Van Loan, *Matrix Computations*, 3rd
885 ed., Baltimore, MD, Johns Hopkins University Press, 1996,
886 pg. 8.
887
888 Examples
889 --------
890 Make a (*very* coarse) grid for computing a Mandelbrot set:
891
892 >>> rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
893 >>> rl
894 array([[-2., -1., 0., 1., 2.],
895 [-2., -1., 0., 1., 2.],
896 [-2., -1., 0., 1., 2.],
897 [-2., -1., 0., 1., 2.],
898 [-2., -1., 0., 1., 2.]])
899 >>> im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
900 >>> im
901 array([[0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j, 0.+2.j],
902 [0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j, 0.+1.j],
903 [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
904 [0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j, 0.-1.j],
905 [0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j, 0.-2.j]])
906 >>> grid = rl + im
907 >>> grid
908 array([[-2.+2.j, -1.+2.j, 0.+2.j, 1.+2.j, 2.+2.j],
909 [-2.+1.j, -1.+1.j, 0.+1.j, 1.+1.j, 2.+1.j],
910 [-2.+0.j, -1.+0.j, 0.+0.j, 1.+0.j, 2.+0.j],
911 [-2.-1.j, -1.-1.j, 0.-1.j, 1.-1.j, 2.-1.j],
912 [-2.-2.j, -1.-2.j, 0.-2.j, 1.-2.j, 2.-2.j]])
913
914 An example using a "vector" of letters:
915
916 >>> x = np.array(['a', 'b', 'c'], dtype=object)
917 >>> np.outer(x, [1, 2, 3])
918 array([['a', 'aa', 'aaa'],
919 ['b', 'bb', 'bbb'],
920 ['c', 'cc', 'ccc']], dtype=object)
921
922 """
923 a = asarray(a)
924 b = asarray(b)
925 return multiply(a.ravel()[:, newaxis], b.ravel()[newaxis, :], out)
926
927
928def _tensordot_dispatcher(a, b, axes=None):
929 return (a, b)
930
931
932@array_function_dispatch(_tensordot_dispatcher)
933def tensordot(a, b, axes=2):
934 """
935 Compute tensor dot product along specified axes.
936
937 Given two tensors, `a` and `b`, and an array_like object containing
938 two array_like objects, ``(a_axes, b_axes)``, sum the products of
939 `a`'s and `b`'s elements (components) over the axes specified by
940 ``a_axes`` and ``b_axes``. The third argument can be a single non-negative
941 integer_like scalar, ``N``; if it is such, then the last ``N`` dimensions
942 of `a` and the first ``N`` dimensions of `b` are summed over.
943
944 Parameters
945 ----------
946 a, b : array_like
947 Tensors to "dot".
948
949 axes : int or (2,) array_like
950 * integer_like
951 If an int N, sum over the last N axes of `a` and the first N axes
952 of `b` in order. The sizes of the corresponding axes must match.
953 * (2,) array_like
954 Or, a list of axes to be summed over, first sequence applying to `a`,
955 second to `b`. Both elements array_like must be of the same length.
956
957 Returns
958 -------
959 output : ndarray
960 The tensor dot product of the input.
961
962 See Also
963 --------
964 dot, einsum
965
966 Notes
967 -----
968 Three common use cases are:
969 * ``axes = 0`` : tensor product :math:`a\\otimes b`
970 * ``axes = 1`` : tensor dot product :math:`a\\cdot b`
971 * ``axes = 2`` : (default) tensor double contraction :math:`a:b`
972
973 When `axes` is integer_like, the sequence for evaluation will be: first
974 the -Nth axis in `a` and 0th axis in `b`, and the -1th axis in `a` and
975 Nth axis in `b` last.
976
977 When there is more than one axis to sum over - and they are not the last
978 (first) axes of `a` (`b`) - the argument `axes` should consist of
979 two sequences of the same length, with the first axis to sum over given
980 first in both sequences, the second axis second, and so forth.
981
982 The shape of the result consists of the non-contracted axes of the
983 first tensor, followed by the non-contracted axes of the second.
984
985 Examples
986 --------
987 A "traditional" example:
988
989 >>> a = np.arange(60.).reshape(3,4,5)
990 >>> b = np.arange(24.).reshape(4,3,2)
991 >>> c = np.tensordot(a,b, axes=([1,0],[0,1]))
992 >>> c.shape
993 (5, 2)
994 >>> c
995 array([[4400., 4730.],
996 [4532., 4874.],
997 [4664., 5018.],
998 [4796., 5162.],
999 [4928., 5306.]])
1000 >>> # A slower but equivalent way of computing the same...
1001 >>> d = np.zeros((5,2))
1002 >>> for i in range(5):
1003 ... for j in range(2):
1004 ... for k in range(3):
1005 ... for n in range(4):
1006 ... d[i,j] += a[k,n,i] * b[n,k,j]
1007 >>> c == d
1008 array([[ True, True],
1009 [ True, True],
1010 [ True, True],
1011 [ True, True],
1012 [ True, True]])
1013
1014 An extended example taking advantage of the overloading of + and \\*:
1015
1016 >>> a = np.array(range(1, 9))
1017 >>> a.shape = (2, 2, 2)
1018 >>> A = np.array(('a', 'b', 'c', 'd'), dtype=object)
1019 >>> A.shape = (2, 2)
1020 >>> a; A
1021 array([[[1, 2],
1022 [3, 4]],
1023 [[5, 6],
1024 [7, 8]]])
1025 array([['a', 'b'],
1026 ['c', 'd']], dtype=object)
1027
1028 >>> np.tensordot(a, A) # third argument default is 2 for double-contraction
1029 array(['abbcccdddd', 'aaaaabbbbbbcccccccdddddddd'], dtype=object)
1030
1031 >>> np.tensordot(a, A, 1)
1032 array([[['acc', 'bdd'],
1033 ['aaacccc', 'bbbdddd']],
1034 [['aaaaacccccc', 'bbbbbdddddd'],
1035 ['aaaaaaacccccccc', 'bbbbbbbdddddddd']]], dtype=object)
1036
1037 >>> np.tensordot(a, A, 0) # tensor product (result too long to incl.)
1038 array([[[[['a', 'b'],
1039 ['c', 'd']],
1040 ...
1041
1042 >>> np.tensordot(a, A, (0, 1))
1043 array([[['abbbbb', 'cddddd'],
1044 ['aabbbbbb', 'ccdddddd']],
1045 [['aaabbbbbbb', 'cccddddddd'],
1046 ['aaaabbbbbbbb', 'ccccdddddddd']]], dtype=object)
1047
1048 >>> np.tensordot(a, A, (2, 1))
1049 array([[['abb', 'cdd'],
1050 ['aaabbbb', 'cccdddd']],
1051 [['aaaaabbbbbb', 'cccccdddddd'],
1052 ['aaaaaaabbbbbbbb', 'cccccccdddddddd']]], dtype=object)
1053
1054 >>> np.tensordot(a, A, ((0, 1), (0, 1)))
1055 array(['abbbcccccddddddd', 'aabbbbccccccdddddddd'], dtype=object)
1056
1057 >>> np.tensordot(a, A, ((2, 1), (1, 0)))
1058 array(['acccbbdddd', 'aaaaacccccccbbbbbbdddddddd'], dtype=object)
1059
1060 """
1061 try:
1062 iter(axes)
1063 except Exception:
1064 axes_a = list(range(-axes, 0))
1065 axes_b = list(range(0, axes))
1066 else:
1067 axes_a, axes_b = axes
1068 try:
1069 na = len(axes_a)
1070 axes_a = list(axes_a)
1071 except TypeError:
1072 axes_a = [axes_a]
1073 na = 1
1074 try:
1075 nb = len(axes_b)
1076 axes_b = list(axes_b)
1077 except TypeError:
1078 axes_b = [axes_b]
1079 nb = 1
1080
1081 a, b = asarray(a), asarray(b)
1082 as_ = a.shape
1083 nda = a.ndim
1084 bs = b.shape
1085 ndb = b.ndim
1086 equal = True
1087 if na != nb:
1088 equal = False
1089 else:
1090 for k in range(na):
1091 if as_[axes_a[k]] != bs[axes_b[k]]:
1092 equal = False
1093 break
1094 if axes_a[k] < 0:
1095 axes_a[k] += nda
1096 if axes_b[k] < 0:
1097 axes_b[k] += ndb
1098 if not equal:
1099 raise ValueError("shape-mismatch for sum")
1100
1101 # Move the axes to sum over to the end of "a"
1102 # and to the front of "b"
1103 notin = [k for k in range(nda) if k not in axes_a]
1104 newaxes_a = notin + axes_a
1105 N2 = 1
1106 for axis in axes_a:
1107 N2 *= as_[axis]
1108 newshape_a = (int(multiply.reduce([as_[ax] for ax in notin])), N2)
1109 olda = [as_[axis] for axis in notin]
1110
1111 notin = [k for k in range(ndb) if k not in axes_b]
1112 newaxes_b = axes_b + notin
1113 N2 = 1
1114 for axis in axes_b:
1115 N2 *= bs[axis]
1116 newshape_b = (N2, int(multiply.reduce([bs[ax] for ax in notin])))
1117 oldb = [bs[axis] for axis in notin]
1118
1119 at = a.transpose(newaxes_a).reshape(newshape_a)
1120 bt = b.transpose(newaxes_b).reshape(newshape_b)
1121 res = dot(at, bt)
1122 return res.reshape(olda + oldb)
1123
1124
1125def _roll_dispatcher(a, shift, axis=None):
1126 return (a,)
1127
1128
1129@array_function_dispatch(_roll_dispatcher)
1130def roll(a, shift, axis=None):
1131 """
1132 Roll array elements along a given axis.
1133
1134 Elements that roll beyond the last position are re-introduced at
1135 the first.
1136
1137 Parameters
1138 ----------
1139 a : array_like
1140 Input array.
1141 shift : int or tuple of ints
1142 The number of places by which elements are shifted. If a tuple,
1143 then `axis` must be a tuple of the same size, and each of the
1144 given axes is shifted by the corresponding number. If an int
1145 while `axis` is a tuple of ints, then the same value is used for
1146 all given axes.
1147 axis : int or tuple of ints, optional
1148 Axis or axes along which elements are shifted. By default, the
1149 array is flattened before shifting, after which the original
1150 shape is restored.
1151
1152 Returns
1153 -------
1154 res : ndarray
1155 Output array, with the same shape as `a`.
1156
1157 See Also
1158 --------
1159 rollaxis : Roll the specified axis backwards, until it lies in a
1160 given position.
1161
1162 Notes
1163 -----
1164 .. versionadded:: 1.12.0
1165
1166 Supports rolling over multiple dimensions simultaneously.
1167
1168 Examples
1169 --------
1170 >>> x = np.arange(10)
1171 >>> np.roll(x, 2)
1172 array([8, 9, 0, 1, 2, 3, 4, 5, 6, 7])
1173 >>> np.roll(x, -2)
1174 array([2, 3, 4, 5, 6, 7, 8, 9, 0, 1])
1175
1176 >>> x2 = np.reshape(x, (2, 5))
1177 >>> x2
1178 array([[0, 1, 2, 3, 4],
1179 [5, 6, 7, 8, 9]])
1180 >>> np.roll(x2, 1)
1181 array([[9, 0, 1, 2, 3],
1182 [4, 5, 6, 7, 8]])
1183 >>> np.roll(x2, -1)
1184 array([[1, 2, 3, 4, 5],
1185 [6, 7, 8, 9, 0]])
1186 >>> np.roll(x2, 1, axis=0)
1187 array([[5, 6, 7, 8, 9],
1188 [0, 1, 2, 3, 4]])
1189 >>> np.roll(x2, -1, axis=0)
1190 array([[5, 6, 7, 8, 9],
1191 [0, 1, 2, 3, 4]])
1192 >>> np.roll(x2, 1, axis=1)
1193 array([[4, 0, 1, 2, 3],
1194 [9, 5, 6, 7, 8]])
1195 >>> np.roll(x2, -1, axis=1)
1196 array([[1, 2, 3, 4, 0],
1197 [6, 7, 8, 9, 5]])
1198 >>> np.roll(x2, (1, 1), axis=(1, 0))
1199 array([[9, 5, 6, 7, 8],
1200 [4, 0, 1, 2, 3]])
1201 >>> np.roll(x2, (2, 1), axis=(1, 0))
1202 array([[8, 9, 5, 6, 7],
1203 [3, 4, 0, 1, 2]])
1204
1205 """
1206 a = asanyarray(a)
1207 if axis is None:
1208 return roll(a.ravel(), shift, 0).reshape(a.shape)
1209
1210 else:
1211 axis = normalize_axis_tuple(axis, a.ndim, allow_duplicate=True)
1212 broadcasted = broadcast(shift, axis)
1213 if broadcasted.ndim > 1:
1214 raise ValueError(
1215 "'shift' and 'axis' should be scalars or 1D sequences")
1216 shifts = {ax: 0 for ax in range(a.ndim)}
1217 for sh, ax in broadcasted:
1218 shifts[ax] += sh
1219
1220 rolls = [((slice(None), slice(None)),)] * a.ndim
1221 for ax, offset in shifts.items():
1222 offset %= a.shape[ax] or 1 # If `a` is empty, nothing matters.
1223 if offset:
1224 # (original, result), (original, result)
1225 rolls[ax] = ((slice(None, -offset), slice(offset, None)),
1226 (slice(-offset, None), slice(None, offset)))
1227
1228 result = empty_like(a)
1229 for indices in itertools.product(*rolls):
1230 arr_index, res_index = zip(*indices)
1231 result[res_index] = a[arr_index]
1232
1233 return result
1234
1235
1236def _rollaxis_dispatcher(a, axis, start=None):
1237 return (a,)
1238
1239
1240@array_function_dispatch(_rollaxis_dispatcher)
1241def rollaxis(a, axis, start=0):
1242 """
1243 Roll the specified axis backwards, until it lies in a given position.
1244
1245 This function continues to be supported for backward compatibility, but you
1246 should prefer `moveaxis`. The `moveaxis` function was added in NumPy
1247 1.11.
1248
1249 Parameters
1250 ----------
1251 a : ndarray
1252 Input array.
1253 axis : int
1254 The axis to be rolled. The positions of the other axes do not
1255 change relative to one another.
1256 start : int, optional
1257 When ``start <= axis``, the axis is rolled back until it lies in
1258 this position. When ``start > axis``, the axis is rolled until it
1259 lies before this position. The default, 0, results in a "complete"
1260 roll. The following table describes how negative values of ``start``
1261 are interpreted:
1262
1263 .. table::
1264 :align: left
1265
1266 +-------------------+----------------------+
1267 | ``start`` | Normalized ``start`` |
1268 +===================+======================+
1269 | ``-(arr.ndim+1)`` | raise ``AxisError`` |
1270 +-------------------+----------------------+
1271 | ``-arr.ndim`` | 0 |
1272 +-------------------+----------------------+
1273 | |vdots| | |vdots| |
1274 +-------------------+----------------------+
1275 | ``-1`` | ``arr.ndim-1`` |
1276 +-------------------+----------------------+
1277 | ``0`` | ``0`` |
1278 +-------------------+----------------------+
1279 | |vdots| | |vdots| |
1280 +-------------------+----------------------+
1281 | ``arr.ndim`` | ``arr.ndim`` |
1282 +-------------------+----------------------+
1283 | ``arr.ndim + 1`` | raise ``AxisError`` |
1284 +-------------------+----------------------+
1285
1286 .. |vdots| unicode:: U+22EE .. Vertical Ellipsis
1287
1288 Returns
1289 -------
1290 res : ndarray
1291 For NumPy >= 1.10.0 a view of `a` is always returned. For earlier
1292 NumPy versions a view of `a` is returned only if the order of the
1293 axes is changed, otherwise the input array is returned.
1294
1295 See Also
1296 --------
1297 moveaxis : Move array axes to new positions.
1298 roll : Roll the elements of an array by a number of positions along a
1299 given axis.
1300
1301 Examples
1302 --------
1303 >>> a = np.ones((3,4,5,6))
1304 >>> np.rollaxis(a, 3, 1).shape
1305 (3, 6, 4, 5)
1306 >>> np.rollaxis(a, 2).shape
1307 (5, 3, 4, 6)
1308 >>> np.rollaxis(a, 1, 4).shape
1309 (3, 5, 6, 4)
1310
1311 """
1312 n = a.ndim
1313 axis = normalize_axis_index(axis, n)
1314 if start < 0:
1315 start += n
1316 msg = "'%s' arg requires %d <= %s < %d, but %d was passed in"
1317 if not (0 <= start < n + 1):
1318 raise AxisError(msg % ('start', -n, 'start', n + 1, start))
1319 if axis < start:
1320 # it's been removed
1321 start -= 1
1322 if axis == start:
1323 return a[...]
1324 axes = list(range(0, n))
1325 axes.remove(axis)
1326 axes.insert(start, axis)
1327 return a.transpose(axes)
1328
1329
1330def normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False):
1331 """
1332 Normalizes an axis argument into a tuple of non-negative integer axes.
1333
1334 This handles shorthands such as ``1`` and converts them to ``(1,)``,
1335 as well as performing the handling of negative indices covered by
1336 `normalize_axis_index`.
1337
1338 By default, this forbids axes from being specified multiple times.
1339
1340 Used internally by multi-axis-checking logic.
1341
1342 .. versionadded:: 1.13.0
1343
1344 Parameters
1345 ----------
1346 axis : int, iterable of int
1347 The un-normalized index or indices of the axis.
1348 ndim : int
1349 The number of dimensions of the array that `axis` should be normalized
1350 against.
1351 argname : str, optional
1352 A prefix to put before the error message, typically the name of the
1353 argument.
1354 allow_duplicate : bool, optional
1355 If False, the default, disallow an axis from being specified twice.
1356
1357 Returns
1358 -------
1359 normalized_axes : tuple of int
1360 The normalized axis index, such that `0 <= normalized_axis < ndim`
1361
1362 Raises
1363 ------
1364 AxisError
1365 If any axis provided is out of range
1366 ValueError
1367 If an axis is repeated
1368
1369 See also
1370 --------
1371 normalize_axis_index : normalizing a single scalar axis
1372 """
1373 # Optimization to speed-up the most common cases.
1374 if type(axis) not in (tuple, list):
1375 try:
1376 axis = [operator.index(axis)]
1377 except TypeError:
1378 pass
1379 # Going via an iterator directly is slower than via list comprehension.
1380 axis = tuple([normalize_axis_index(ax, ndim, argname) for ax in axis])
1381 if not allow_duplicate and len(set(axis)) != len(axis):
1382 if argname:
1383 raise ValueError('repeated axis in `{}` argument'.format(argname))
1384 else:
1385 raise ValueError('repeated axis')
1386 return axis
1387
1388
1389def _moveaxis_dispatcher(a, source, destination):
1390 return (a,)
1391
1392
1393@array_function_dispatch(_moveaxis_dispatcher)
1394def moveaxis(a, source, destination):
1395 """
1396 Move axes of an array to new positions.
1397
1398 Other axes remain in their original order.
1399
1400 .. versionadded:: 1.11.0
1401
1402 Parameters
1403 ----------
1404 a : np.ndarray
1405 The array whose axes should be reordered.
1406 source : int or sequence of int
1407 Original positions of the axes to move. These must be unique.
1408 destination : int or sequence of int
1409 Destination positions for each of the original axes. These must also be
1410 unique.
1411
1412 Returns
1413 -------
1414 result : np.ndarray
1415 Array with moved axes. This array is a view of the input array.
1416
1417 See Also
1418 --------
1419 transpose : Permute the dimensions of an array.
1420 swapaxes : Interchange two axes of an array.
1421
1422 Examples
1423 --------
1424 >>> x = np.zeros((3, 4, 5))
1425 >>> np.moveaxis(x, 0, -1).shape
1426 (4, 5, 3)
1427 >>> np.moveaxis(x, -1, 0).shape
1428 (5, 3, 4)
1429
1430 These all achieve the same result:
1431
1432 >>> np.transpose(x).shape
1433 (5, 4, 3)
1434 >>> np.swapaxes(x, 0, -1).shape
1435 (5, 4, 3)
1436 >>> np.moveaxis(x, [0, 1], [-1, -2]).shape
1437 (5, 4, 3)
1438 >>> np.moveaxis(x, [0, 1, 2], [-1, -2, -3]).shape
1439 (5, 4, 3)
1440
1441 """
1442 try:
1443 # allow duck-array types if they define transpose
1444 transpose = a.transpose
1445 except AttributeError:
1446 a = asarray(a)
1447 transpose = a.transpose
1448
1449 source = normalize_axis_tuple(source, a.ndim, 'source')
1450 destination = normalize_axis_tuple(destination, a.ndim, 'destination')
1451 if len(source) != len(destination):
1452 raise ValueError('`source` and `destination` arguments must have '
1453 'the same number of elements')
1454
1455 order = [n for n in range(a.ndim) if n not in source]
1456
1457 for dest, src in sorted(zip(destination, source)):
1458 order.insert(dest, src)
1459
1460 result = transpose(order)
1461 return result
1462
1463
1464def _cross_dispatcher(a, b, axisa=None, axisb=None, axisc=None, axis=None):
1465 return (a, b)
1466
1467
1468@array_function_dispatch(_cross_dispatcher)
1469def cross(a, b, axisa=-1, axisb=-1, axisc=-1, axis=None):
1470 """
1471 Return the cross product of two (arrays of) vectors.
1472
1473 The cross product of `a` and `b` in :math:`R^3` is a vector perpendicular
1474 to both `a` and `b`. If `a` and `b` are arrays of vectors, the vectors
1475 are defined by the last axis of `a` and `b` by default, and these axes
1476 can have dimensions 2 or 3. Where the dimension of either `a` or `b` is
1477 2, the third component of the input vector is assumed to be zero and the
1478 cross product calculated accordingly. In cases where both input vectors
1479 have dimension 2, the z-component of the cross product is returned.
1480
1481 Parameters
1482 ----------
1483 a : array_like
1484 Components of the first vector(s).
1485 b : array_like
1486 Components of the second vector(s).
1487 axisa : int, optional
1488 Axis of `a` that defines the vector(s). By default, the last axis.
1489 axisb : int, optional
1490 Axis of `b` that defines the vector(s). By default, the last axis.
1491 axisc : int, optional
1492 Axis of `c` containing the cross product vector(s). Ignored if
1493 both input vectors have dimension 2, as the return is scalar.
1494 By default, the last axis.
1495 axis : int, optional
1496 If defined, the axis of `a`, `b` and `c` that defines the vector(s)
1497 and cross product(s). Overrides `axisa`, `axisb` and `axisc`.
1498
1499 Returns
1500 -------
1501 c : ndarray
1502 Vector cross product(s).
1503
1504 Raises
1505 ------
1506 ValueError
1507 When the dimension of the vector(s) in `a` and/or `b` does not
1508 equal 2 or 3.
1509
1510 See Also
1511 --------
1512 inner : Inner product
1513 outer : Outer product.
1514 ix_ : Construct index arrays.
1515
1516 Notes
1517 -----
1518 .. versionadded:: 1.9.0
1519
1520 Supports full broadcasting of the inputs.
1521
1522 Examples
1523 --------
1524 Vector cross-product.
1525
1526 >>> x = [1, 2, 3]
1527 >>> y = [4, 5, 6]
1528 >>> np.cross(x, y)
1529 array([-3, 6, -3])
1530
1531 One vector with dimension 2.
1532
1533 >>> x = [1, 2]
1534 >>> y = [4, 5, 6]
1535 >>> np.cross(x, y)
1536 array([12, -6, -3])
1537
1538 Equivalently:
1539
1540 >>> x = [1, 2, 0]
1541 >>> y = [4, 5, 6]
1542 >>> np.cross(x, y)
1543 array([12, -6, -3])
1544
1545 Both vectors with dimension 2.
1546
1547 >>> x = [1,2]
1548 >>> y = [4,5]
1549 >>> np.cross(x, y)
1550 array(-3)
1551
1552 Multiple vector cross-products. Note that the direction of the cross
1553 product vector is defined by the *right-hand rule*.
1554
1555 >>> x = np.array([[1,2,3], [4,5,6]])
1556 >>> y = np.array([[4,5,6], [1,2,3]])
1557 >>> np.cross(x, y)
1558 array([[-3, 6, -3],
1559 [ 3, -6, 3]])
1560
1561 The orientation of `c` can be changed using the `axisc` keyword.
1562
1563 >>> np.cross(x, y, axisc=0)
1564 array([[-3, 3],
1565 [ 6, -6],
1566 [-3, 3]])
1567
1568 Change the vector definition of `x` and `y` using `axisa` and `axisb`.
1569
1570 >>> x = np.array([[1,2,3], [4,5,6], [7, 8, 9]])
1571 >>> y = np.array([[7, 8, 9], [4,5,6], [1,2,3]])
1572 >>> np.cross(x, y)
1573 array([[ -6, 12, -6],
1574 [ 0, 0, 0],
1575 [ 6, -12, 6]])
1576 >>> np.cross(x, y, axisa=0, axisb=0)
1577 array([[-24, 48, -24],
1578 [-30, 60, -30],
1579 [-36, 72, -36]])
1580
1581 """
1582 if axis is not None:
1583 axisa, axisb, axisc = (axis,) * 3
1584 a = asarray(a)
1585 b = asarray(b)
1586 # Check axisa and axisb are within bounds
1587 axisa = normalize_axis_index(axisa, a.ndim, msg_prefix='axisa')
1588 axisb = normalize_axis_index(axisb, b.ndim, msg_prefix='axisb')
1589
1590 # Move working axis to the end of the shape
1591 a = moveaxis(a, axisa, -1)
1592 b = moveaxis(b, axisb, -1)
1593 msg = ("incompatible dimensions for cross product\n"
1594 "(dimension must be 2 or 3)")
1595 if a.shape[-1] not in (2, 3) or b.shape[-1] not in (2, 3):
1596 raise ValueError(msg)
1597
1598 # Create the output array
1599 shape = broadcast(a[..., 0], b[..., 0]).shape
1600 if a.shape[-1] == 3 or b.shape[-1] == 3:
1601 shape += (3,)
1602 # Check axisc is within bounds
1603 axisc = normalize_axis_index(axisc, len(shape), msg_prefix='axisc')
1604 dtype = promote_types(a.dtype, b.dtype)
1605 cp = empty(shape, dtype)
1606
1607 # recast arrays as dtype
1608 a = a.astype(dtype)
1609 b = b.astype(dtype)
1610
1611 # create local aliases for readability
1612 a0 = a[..., 0]
1613 a1 = a[..., 1]
1614 if a.shape[-1] == 3:
1615 a2 = a[..., 2]
1616 b0 = b[..., 0]
1617 b1 = b[..., 1]
1618 if b.shape[-1] == 3:
1619 b2 = b[..., 2]
1620 if cp.ndim != 0 and cp.shape[-1] == 3:
1621 cp0 = cp[..., 0]
1622 cp1 = cp[..., 1]
1623 cp2 = cp[..., 2]
1624
1625 if a.shape[-1] == 2:
1626 if b.shape[-1] == 2:
1627 # a0 * b1 - a1 * b0
1628 multiply(a0, b1, out=cp)
1629 cp -= a1 * b0
1630 return cp
1631 else:
1632 assert b.shape[-1] == 3
1633 # cp0 = a1 * b2 - 0 (a2 = 0)
1634 # cp1 = 0 - a0 * b2 (a2 = 0)
1635 # cp2 = a0 * b1 - a1 * b0
1636 multiply(a1, b2, out=cp0)
1637 multiply(a0, b2, out=cp1)
1638 negative(cp1, out=cp1)
1639 multiply(a0, b1, out=cp2)
1640 cp2 -= a1 * b0
1641 else:
1642 assert a.shape[-1] == 3
1643 if b.shape[-1] == 3:
1644 # cp0 = a1 * b2 - a2 * b1
1645 # cp1 = a2 * b0 - a0 * b2
1646 # cp2 = a0 * b1 - a1 * b0
1647 multiply(a1, b2, out=cp0)
1648 tmp = array(a2 * b1)
1649 cp0 -= tmp
1650 multiply(a2, b0, out=cp1)
1651 multiply(a0, b2, out=tmp)
1652 cp1 -= tmp
1653 multiply(a0, b1, out=cp2)
1654 multiply(a1, b0, out=tmp)
1655 cp2 -= tmp
1656 else:
1657 assert b.shape[-1] == 2
1658 # cp0 = 0 - a2 * b1 (b2 = 0)
1659 # cp1 = a2 * b0 - 0 (b2 = 0)
1660 # cp2 = a0 * b1 - a1 * b0
1661 multiply(a2, b1, out=cp0)
1662 negative(cp0, out=cp0)
1663 multiply(a2, b0, out=cp1)
1664 multiply(a0, b1, out=cp2)
1665 cp2 -= a1 * b0
1666
1667 return moveaxis(cp, -1, axisc)
1668
1669
1670little_endian = (sys.byteorder == 'little')
1671
1672
1673@set_module('numpy')
1674def indices(dimensions, dtype=int, sparse=False):
1675 """
1676 Return an array representing the indices of a grid.
1677
1678 Compute an array where the subarrays contain index values 0, 1, ...
1679 varying only along the corresponding axis.
1680
1681 Parameters
1682 ----------
1683 dimensions : sequence of ints
1684 The shape of the grid.
1685 dtype : dtype, optional
1686 Data type of the result.
1687 sparse : boolean, optional
1688 Return a sparse representation of the grid instead of a dense
1689 representation. Default is False.
1690
1691 .. versionadded:: 1.17
1692
1693 Returns
1694 -------
1695 grid : one ndarray or tuple of ndarrays
1696 If sparse is False:
1697 Returns one array of grid indices,
1698 ``grid.shape = (len(dimensions),) + tuple(dimensions)``.
1699 If sparse is True:
1700 Returns a tuple of arrays, with
1701 ``grid[i].shape = (1, ..., 1, dimensions[i], 1, ..., 1)`` with
1702 dimensions[i] in the ith place
1703
1704 See Also
1705 --------
1706 mgrid, ogrid, meshgrid
1707
1708 Notes
1709 -----
1710 The output shape in the dense case is obtained by prepending the number
1711 of dimensions in front of the tuple of dimensions, i.e. if `dimensions`
1712 is a tuple ``(r0, ..., rN-1)`` of length ``N``, the output shape is
1713 ``(N, r0, ..., rN-1)``.
1714
1715 The subarrays ``grid[k]`` contains the N-D array of indices along the
1716 ``k-th`` axis. Explicitly::
1717
1718 grid[k, i0, i1, ..., iN-1] = ik
1719
1720 Examples
1721 --------
1722 >>> grid = np.indices((2, 3))
1723 >>> grid.shape
1724 (2, 2, 3)
1725 >>> grid[0] # row indices
1726 array([[0, 0, 0],
1727 [1, 1, 1]])
1728 >>> grid[1] # column indices
1729 array([[0, 1, 2],
1730 [0, 1, 2]])
1731
1732 The indices can be used as an index into an array.
1733
1734 >>> x = np.arange(20).reshape(5, 4)
1735 >>> row, col = np.indices((2, 3))
1736 >>> x[row, col]
1737 array([[0, 1, 2],
1738 [4, 5, 6]])
1739
1740 Note that it would be more straightforward in the above example to
1741 extract the required elements directly with ``x[:2, :3]``.
1742
1743 If sparse is set to true, the grid will be returned in a sparse
1744 representation.
1745
1746 >>> i, j = np.indices((2, 3), sparse=True)
1747 >>> i.shape
1748 (2, 1)
1749 >>> j.shape
1750 (1, 3)
1751 >>> i # row indices
1752 array([[0],
1753 [1]])
1754 >>> j # column indices
1755 array([[0, 1, 2]])
1756
1757 """
1758 dimensions = tuple(dimensions)
1759 N = len(dimensions)
1760 shape = (1,)*N
1761 if sparse:
1762 res = tuple()
1763 else:
1764 res = empty((N,)+dimensions, dtype=dtype)
1765 for i, dim in enumerate(dimensions):
1766 idx = arange(dim, dtype=dtype).reshape(
1767 shape[:i] + (dim,) + shape[i+1:]
1768 )
1769 if sparse:
1770 res = res + (idx,)
1771 else:
1772 res[i] = idx
1773 return res
1774
1775
1776@set_array_function_like_doc
1777@set_module('numpy')
1778def fromfunction(function, shape, *, dtype=float, like=None, **kwargs):
1779 """
1780 Construct an array by executing a function over each coordinate.
1781
1782 The resulting array therefore has a value ``fn(x, y, z)`` at
1783 coordinate ``(x, y, z)``.
1784
1785 Parameters
1786 ----------
1787 function : callable
1788 The function is called with N parameters, where N is the rank of
1789 `shape`. Each parameter represents the coordinates of the array
1790 varying along a specific axis. For example, if `shape`
1791 were ``(2, 2)``, then the parameters would be
1792 ``array([[0, 0], [1, 1]])`` and ``array([[0, 1], [0, 1]])``
1793 shape : (N,) tuple of ints
1794 Shape of the output array, which also determines the shape of
1795 the coordinate arrays passed to `function`.
1796 dtype : data-type, optional
1797 Data-type of the coordinate arrays passed to `function`.
1798 By default, `dtype` is float.
1799 ${ARRAY_FUNCTION_LIKE}
1800
1801 .. versionadded:: 1.20.0
1802
1803 Returns
1804 -------
1805 fromfunction : any
1806 The result of the call to `function` is passed back directly.
1807 Therefore the shape of `fromfunction` is completely determined by
1808 `function`. If `function` returns a scalar value, the shape of
1809 `fromfunction` would not match the `shape` parameter.
1810
1811 See Also
1812 --------
1813 indices, meshgrid
1814
1815 Notes
1816 -----
1817 Keywords other than `dtype` and `like` are passed to `function`.
1818
1819 Examples
1820 --------
1821 >>> np.fromfunction(lambda i, j: i, (2, 2), dtype=float)
1822 array([[0., 0.],
1823 [1., 1.]])
1824
1825 >>> np.fromfunction(lambda i, j: j, (2, 2), dtype=float)
1826 array([[0., 1.],
1827 [0., 1.]])
1828
1829 >>> np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)
1830 array([[ True, False, False],
1831 [False, True, False],
1832 [False, False, True]])
1833
1834 >>> np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)
1835 array([[0, 1, 2],
1836 [1, 2, 3],
1837 [2, 3, 4]])
1838
1839 """
1840 if like is not None:
1841 return _fromfunction_with_like(
1842 like, function, shape, dtype=dtype, **kwargs)
1843
1844 args = indices(shape, dtype=dtype)
1845 return function(*args, **kwargs)
1846
1847
1848_fromfunction_with_like = array_function_dispatch()(fromfunction)
1849
1850
1851def _frombuffer(buf, dtype, shape, order):
1852 return frombuffer(buf, dtype=dtype).reshape(shape, order=order)
1853
1854
1855@set_module('numpy')
1856def isscalar(element):
1857 """
1858 Returns True if the type of `element` is a scalar type.
1859
1860 Parameters
1861 ----------
1862 element : any
1863 Input argument, can be of any type and shape.
1864
1865 Returns
1866 -------
1867 val : bool
1868 True if `element` is a scalar type, False if it is not.
1869
1870 See Also
1871 --------
1872 ndim : Get the number of dimensions of an array
1873
1874 Notes
1875 -----
1876 If you need a stricter way to identify a *numerical* scalar, use
1877 ``isinstance(x, numbers.Number)``, as that returns ``False`` for most
1878 non-numerical elements such as strings.
1879
1880 In most cases ``np.ndim(x) == 0`` should be used instead of this function,
1881 as that will also return true for 0d arrays. This is how numpy overloads
1882 functions in the style of the ``dx`` arguments to `gradient` and the ``bins``
1883 argument to `histogram`. Some key differences:
1884
1885 +--------------------------------------+---------------+-------------------+
1886 | x |``isscalar(x)``|``np.ndim(x) == 0``|
1887 +======================================+===============+===================+
1888 | PEP 3141 numeric objects (including | ``True`` | ``True`` |
1889 | builtins) | | |
1890 +--------------------------------------+---------------+-------------------+
1891 | builtin string and buffer objects | ``True`` | ``True`` |
1892 +--------------------------------------+---------------+-------------------+
1893 | other builtin objects, like | ``False`` | ``True`` |
1894 | `pathlib.Path`, `Exception`, | | |
1895 | the result of `re.compile` | | |
1896 +--------------------------------------+---------------+-------------------+
1897 | third-party objects like | ``False`` | ``True`` |
1898 | `matplotlib.figure.Figure` | | |
1899 +--------------------------------------+---------------+-------------------+
1900 | zero-dimensional numpy arrays | ``False`` | ``True`` |
1901 +--------------------------------------+---------------+-------------------+
1902 | other numpy arrays | ``False`` | ``False`` |
1903 +--------------------------------------+---------------+-------------------+
1904 | `list`, `tuple`, and other sequence | ``False`` | ``False`` |
1905 | objects | | |
1906 +--------------------------------------+---------------+-------------------+
1907
1908 Examples
1909 --------
1910 >>> np.isscalar(3.1)
1911 True
1912 >>> np.isscalar(np.array(3.1))
1913 False
1914 >>> np.isscalar([3.1])
1915 False
1916 >>> np.isscalar(False)
1917 True
1918 >>> np.isscalar('numpy')
1919 True
1920
1921 NumPy supports PEP 3141 numbers:
1922
1923 >>> from fractions import Fraction
1924 >>> np.isscalar(Fraction(5, 17))
1925 True
1926 >>> from numbers import Number
1927 >>> np.isscalar(Number())
1928 True
1929
1930 """
1931 return (isinstance(element, generic)
1932 or type(element) in ScalarType
1933 or isinstance(element, numbers.Number))
1934
1935
1936@set_module('numpy')
1937def binary_repr(num, width=None):
1938 """
1939 Return the binary representation of the input number as a string.
1940
1941 For negative numbers, if width is not given, a minus sign is added to the
1942 front. If width is given, the two's complement of the number is
1943 returned, with respect to that width.
1944
1945 In a two's-complement system negative numbers are represented by the two's
1946 complement of the absolute value. This is the most common method of
1947 representing signed integers on computers [1]_. A N-bit two's-complement
1948 system can represent every integer in the range
1949 :math:`-2^{N-1}` to :math:`+2^{N-1}-1`.
1950
1951 Parameters
1952 ----------
1953 num : int
1954 Only an integer decimal number can be used.
1955 width : int, optional
1956 The length of the returned string if `num` is positive, or the length
1957 of the two's complement if `num` is negative, provided that `width` is
1958 at least a sufficient number of bits for `num` to be represented in the
1959 designated form.
1960
1961 If the `width` value is insufficient, it will be ignored, and `num` will
1962 be returned in binary (`num` > 0) or two's complement (`num` < 0) form
1963 with its width equal to the minimum number of bits needed to represent
1964 the number in the designated form. This behavior is deprecated and will
1965 later raise an error.
1966
1967 .. deprecated:: 1.12.0
1968
1969 Returns
1970 -------
1971 bin : str
1972 Binary representation of `num` or two's complement of `num`.
1973
1974 See Also
1975 --------
1976 base_repr: Return a string representation of a number in the given base
1977 system.
1978 bin: Python's built-in binary representation generator of an integer.
1979
1980 Notes
1981 -----
1982 `binary_repr` is equivalent to using `base_repr` with base 2, but about 25x
1983 faster.
1984
1985 References
1986 ----------
1987 .. [1] Wikipedia, "Two's complement",
1988 https://en.wikipedia.org/wiki/Two's_complement
1989
1990 Examples
1991 --------
1992 >>> np.binary_repr(3)
1993 '11'
1994 >>> np.binary_repr(-3)
1995 '-11'
1996 >>> np.binary_repr(3, width=4)
1997 '0011'
1998
1999 The two's complement is returned when the input number is negative and
2000 width is specified:
2001
2002 >>> np.binary_repr(-3, width=3)
2003 '101'
2004 >>> np.binary_repr(-3, width=5)
2005 '11101'
2006
2007 """
2008 def warn_if_insufficient(width, binwidth):
2009 if width is not None and width < binwidth:
2010 warnings.warn(
2011 "Insufficient bit width provided. This behavior "
2012 "will raise an error in the future.", DeprecationWarning,
2013 stacklevel=3)
2014
2015 # Ensure that num is a Python integer to avoid overflow or unwanted
2016 # casts to floating point.
2017 num = operator.index(num)
2018
2019 if num == 0:
2020 return '0' * (width or 1)
2021
2022 elif num > 0:
2023 binary = bin(num)[2:]
2024 binwidth = len(binary)
2025 outwidth = (binwidth if width is None
2026 else builtins.max(binwidth, width))
2027 warn_if_insufficient(width, binwidth)
2028 return binary.zfill(outwidth)
2029
2030 else:
2031 if width is None:
2032 return '-' + bin(-num)[2:]
2033
2034 else:
2035 poswidth = len(bin(-num)[2:])
2036
2037 # See gh-8679: remove extra digit
2038 # for numbers at boundaries.
2039 if 2**(poswidth - 1) == -num:
2040 poswidth -= 1
2041
2042 twocomp = 2**(poswidth + 1) + num
2043 binary = bin(twocomp)[2:]
2044 binwidth = len(binary)
2045
2046 outwidth = builtins.max(binwidth, width)
2047 warn_if_insufficient(width, binwidth)
2048 return '1' * (outwidth - binwidth) + binary
2049
2050
2051@set_module('numpy')
2052def base_repr(number, base=2, padding=0):
2053 """
2054 Return a string representation of a number in the given base system.
2055
2056 Parameters
2057 ----------
2058 number : int
2059 The value to convert. Positive and negative values are handled.
2060 base : int, optional
2061 Convert `number` to the `base` number system. The valid range is 2-36,
2062 the default value is 2.
2063 padding : int, optional
2064 Number of zeros padded on the left. Default is 0 (no padding).
2065
2066 Returns
2067 -------
2068 out : str
2069 String representation of `number` in `base` system.
2070
2071 See Also
2072 --------
2073 binary_repr : Faster version of `base_repr` for base 2.
2074
2075 Examples
2076 --------
2077 >>> np.base_repr(5)
2078 '101'
2079 >>> np.base_repr(6, 5)
2080 '11'
2081 >>> np.base_repr(7, base=5, padding=3)
2082 '00012'
2083
2084 >>> np.base_repr(10, base=16)
2085 'A'
2086 >>> np.base_repr(32, base=16)
2087 '20'
2088
2089 """
2090 digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
2091 if base > len(digits):
2092 raise ValueError("Bases greater than 36 not handled in base_repr.")
2093 elif base < 2:
2094 raise ValueError("Bases less than 2 not handled in base_repr.")
2095
2096 num = abs(number)
2097 res = []
2098 while num:
2099 res.append(digits[num % base])
2100 num //= base
2101 if padding:
2102 res.append('0' * padding)
2103 if number < 0:
2104 res.append('-')
2105 return ''.join(reversed(res or '0'))
2106
2107
2108# These are all essentially abbreviations
2109# These might wind up in a special abbreviations module
2110
2111
2112def _maketup(descr, val):
2113 dt = dtype(descr)
2114 # Place val in all scalar tuples:
2115 fields = dt.fields
2116 if fields is None:
2117 return val
2118 else:
2119 res = [_maketup(fields[name][0], val) for name in dt.names]
2120 return tuple(res)
2121
2122
2123@set_array_function_like_doc
2124@set_module('numpy')
2125def identity(n, dtype=None, *, like=None):
2126 """
2127 Return the identity array.
2128
2129 The identity array is a square array with ones on
2130 the main diagonal.
2131
2132 Parameters
2133 ----------
2134 n : int
2135 Number of rows (and columns) in `n` x `n` output.
2136 dtype : data-type, optional
2137 Data-type of the output. Defaults to ``float``.
2138 ${ARRAY_FUNCTION_LIKE}
2139
2140 .. versionadded:: 1.20.0
2141
2142 Returns
2143 -------
2144 out : ndarray
2145 `n` x `n` array with its main diagonal set to one,
2146 and all other elements 0.
2147
2148 Examples
2149 --------
2150 >>> np.identity(3)
2151 array([[1., 0., 0.],
2152 [0., 1., 0.],
2153 [0., 0., 1.]])
2154
2155 """
2156 if like is not None:
2157 return _identity_with_like(like, n, dtype=dtype)
2158
2159 from numpy import eye
2160 return eye(n, dtype=dtype, like=like)
2161
2162
2163_identity_with_like = array_function_dispatch()(identity)
2164
2165
2166def _allclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
2167 return (a, b)
2168
2169
2170@array_function_dispatch(_allclose_dispatcher)
2171def allclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
2172 """
2173 Returns True if two arrays are element-wise equal within a tolerance.
2174
2175 The tolerance values are positive, typically very small numbers. The
2176 relative difference (`rtol` * abs(`b`)) and the absolute difference
2177 `atol` are added together to compare against the absolute difference
2178 between `a` and `b`.
2179
2180 NaNs are treated as equal if they are in the same place and if
2181 ``equal_nan=True``. Infs are treated as equal if they are in the same
2182 place and of the same sign in both arrays.
2183
2184 Parameters
2185 ----------
2186 a, b : array_like
2187 Input arrays to compare.
2188 rtol : float
2189 The relative tolerance parameter (see Notes).
2190 atol : float
2191 The absolute tolerance parameter (see Notes).
2192 equal_nan : bool
2193 Whether to compare NaN's as equal. If True, NaN's in `a` will be
2194 considered equal to NaN's in `b` in the output array.
2195
2196 .. versionadded:: 1.10.0
2197
2198 Returns
2199 -------
2200 allclose : bool
2201 Returns True if the two arrays are equal within the given
2202 tolerance; False otherwise.
2203
2204 See Also
2205 --------
2206 isclose, all, any, equal
2207
2208 Notes
2209 -----
2210 If the following equation is element-wise True, then allclose returns
2211 True.
2212
2213 absolute(`a` - `b`) <= (`atol` + `rtol` * absolute(`b`))
2214
2215 The above equation is not symmetric in `a` and `b`, so that
2216 ``allclose(a, b)`` might be different from ``allclose(b, a)`` in
2217 some rare cases.
2218
2219 The comparison of `a` and `b` uses standard broadcasting, which
2220 means that `a` and `b` need not have the same shape in order for
2221 ``allclose(a, b)`` to evaluate to True. The same is true for
2222 `equal` but not `array_equal`.
2223
2224 `allclose` is not defined for non-numeric data types.
2225 `bool` is considered a numeric data-type for this purpose.
2226
2227 Examples
2228 --------
2229 >>> np.allclose([1e10,1e-7], [1.00001e10,1e-8])
2230 False
2231 >>> np.allclose([1e10,1e-8], [1.00001e10,1e-9])
2232 True
2233 >>> np.allclose([1e10,1e-8], [1.0001e10,1e-9])
2234 False
2235 >>> np.allclose([1.0, np.nan], [1.0, np.nan])
2236 False
2237 >>> np.allclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
2238 True
2239
2240 """
2241 res = all(isclose(a, b, rtol=rtol, atol=atol, equal_nan=equal_nan))
2242 return bool(res)
2243
2244
2245def _isclose_dispatcher(a, b, rtol=None, atol=None, equal_nan=None):
2246 return (a, b)
2247
2248
2249@array_function_dispatch(_isclose_dispatcher)
2250def isclose(a, b, rtol=1.e-5, atol=1.e-8, equal_nan=False):
2251 """
2252 Returns a boolean array where two arrays are element-wise equal within a
2253 tolerance.
2254
2255 The tolerance values are positive, typically very small numbers. The
2256 relative difference (`rtol` * abs(`b`)) and the absolute difference
2257 `atol` are added together to compare against the absolute difference
2258 between `a` and `b`.
2259
2260 .. warning:: The default `atol` is not appropriate for comparing numbers
2261 that are much smaller than one (see Notes).
2262
2263 Parameters
2264 ----------
2265 a, b : array_like
2266 Input arrays to compare.
2267 rtol : float
2268 The relative tolerance parameter (see Notes).
2269 atol : float
2270 The absolute tolerance parameter (see Notes).
2271 equal_nan : bool
2272 Whether to compare NaN's as equal. If True, NaN's in `a` will be
2273 considered equal to NaN's in `b` in the output array.
2274
2275 Returns
2276 -------
2277 y : array_like
2278 Returns a boolean array of where `a` and `b` are equal within the
2279 given tolerance. If both `a` and `b` are scalars, returns a single
2280 boolean value.
2281
2282 See Also
2283 --------
2284 allclose
2285 math.isclose
2286
2287 Notes
2288 -----
2289 .. versionadded:: 1.7.0
2290
2291 For finite values, isclose uses the following equation to test whether
2292 two floating point values are equivalent.
2293
2294 absolute(`a` - `b`) <= (`atol` + `rtol` * absolute(`b`))
2295
2296 Unlike the built-in `math.isclose`, the above equation is not symmetric
2297 in `a` and `b` -- it assumes `b` is the reference value -- so that
2298 `isclose(a, b)` might be different from `isclose(b, a)`. Furthermore,
2299 the default value of atol is not zero, and is used to determine what
2300 small values should be considered close to zero. The default value is
2301 appropriate for expected values of order unity: if the expected values
2302 are significantly smaller than one, it can result in false positives.
2303 `atol` should be carefully selected for the use case at hand. A zero value
2304 for `atol` will result in `False` if either `a` or `b` is zero.
2305
2306 `isclose` is not defined for non-numeric data types.
2307 `bool` is considered a numeric data-type for this purpose.
2308
2309 Examples
2310 --------
2311 >>> np.isclose([1e10,1e-7], [1.00001e10,1e-8])
2312 array([ True, False])
2313 >>> np.isclose([1e10,1e-8], [1.00001e10,1e-9])
2314 array([ True, True])
2315 >>> np.isclose([1e10,1e-8], [1.0001e10,1e-9])
2316 array([False, True])
2317 >>> np.isclose([1.0, np.nan], [1.0, np.nan])
2318 array([ True, False])
2319 >>> np.isclose([1.0, np.nan], [1.0, np.nan], equal_nan=True)
2320 array([ True, True])
2321 >>> np.isclose([1e-8, 1e-7], [0.0, 0.0])
2322 array([ True, False])
2323 >>> np.isclose([1e-100, 1e-7], [0.0, 0.0], atol=0.0)
2324 array([False, False])
2325 >>> np.isclose([1e-10, 1e-10], [1e-20, 0.0])
2326 array([ True, True])
2327 >>> np.isclose([1e-10, 1e-10], [1e-20, 0.999999e-10], atol=0.0)
2328 array([False, True])
2329 """
2330 def within_tol(x, y, atol, rtol):
2331 with errstate(invalid='ignore'), _no_nep50_warning():
2332 return less_equal(abs(x-y), atol + rtol * abs(y))
2333
2334 x = asanyarray(a)
2335 y = asanyarray(b)
2336
2337 # Make sure y is an inexact type to avoid bad behavior on abs(MIN_INT).
2338 # This will cause casting of x later. Also, make sure to allow subclasses
2339 # (e.g., for numpy.ma).
2340 # NOTE: We explicitly allow timedelta, which used to work. This could
2341 # possibly be deprecated. See also gh-18286.
2342 # timedelta works if `atol` is an integer or also a timedelta.
2343 # Although, the default tolerances are unlikely to be useful
2344 if y.dtype.kind != "m":
2345 dt = multiarray.result_type(y, 1.)
2346 y = asanyarray(y, dtype=dt)
2347
2348 xfin = isfinite(x)
2349 yfin = isfinite(y)
2350 if all(xfin) and all(yfin):
2351 return within_tol(x, y, atol, rtol)
2352 else:
2353 finite = xfin & yfin
2354 cond = zeros_like(finite, subok=True)
2355 # Because we're using boolean indexing, x & y must be the same shape.
2356 # Ideally, we'd just do x, y = broadcast_arrays(x, y). It's in
2357 # lib.stride_tricks, though, so we can't import it here.
2358 x = x * ones_like(cond)
2359 y = y * ones_like(cond)
2360 # Avoid subtraction with infinite/nan values...
2361 cond[finite] = within_tol(x[finite], y[finite], atol, rtol)
2362 # Check for equality of infinite values...
2363 cond[~finite] = (x[~finite] == y[~finite])
2364 if equal_nan:
2365 # Make NaN == NaN
2366 both_nan = isnan(x) & isnan(y)
2367
2368 # Needed to treat masked arrays correctly. = True would not work.
2369 cond[both_nan] = both_nan[both_nan]
2370
2371 return cond[()] # Flatten 0d arrays to scalars
2372
2373
2374def _array_equal_dispatcher(a1, a2, equal_nan=None):
2375 return (a1, a2)
2376
2377
2378@array_function_dispatch(_array_equal_dispatcher)
2379def array_equal(a1, a2, equal_nan=False):
2380 """
2381 True if two arrays have the same shape and elements, False otherwise.
2382
2383 Parameters
2384 ----------
2385 a1, a2 : array_like
2386 Input arrays.
2387 equal_nan : bool
2388 Whether to compare NaN's as equal. If the dtype of a1 and a2 is
2389 complex, values will be considered equal if either the real or the
2390 imaginary component of a given value is ``nan``.
2391
2392 .. versionadded:: 1.19.0
2393
2394 Returns
2395 -------
2396 b : bool
2397 Returns True if the arrays are equal.
2398
2399 See Also
2400 --------
2401 allclose: Returns True if two arrays are element-wise equal within a
2402 tolerance.
2403 array_equiv: Returns True if input arrays are shape consistent and all
2404 elements equal.
2405
2406 Examples
2407 --------
2408 >>> np.array_equal([1, 2], [1, 2])
2409 True
2410 >>> np.array_equal(np.array([1, 2]), np.array([1, 2]))
2411 True
2412 >>> np.array_equal([1, 2], [1, 2, 3])
2413 False
2414 >>> np.array_equal([1, 2], [1, 4])
2415 False
2416 >>> a = np.array([1, np.nan])
2417 >>> np.array_equal(a, a)
2418 False
2419 >>> np.array_equal(a, a, equal_nan=True)
2420 True
2421
2422 When ``equal_nan`` is True, complex values with nan components are
2423 considered equal if either the real *or* the imaginary components are nan.
2424
2425 >>> a = np.array([1 + 1j])
2426 >>> b = a.copy()
2427 >>> a.real = np.nan
2428 >>> b.imag = np.nan
2429 >>> np.array_equal(a, b, equal_nan=True)
2430 True
2431 """
2432 try:
2433 a1, a2 = asarray(a1), asarray(a2)
2434 except Exception:
2435 return False
2436 if a1.shape != a2.shape:
2437 return False
2438 if not equal_nan:
2439 return bool(asarray(a1 == a2).all())
2440 # Handling NaN values if equal_nan is True
2441 a1nan, a2nan = isnan(a1), isnan(a2)
2442 # NaN's occur at different locations
2443 if not (a1nan == a2nan).all():
2444 return False
2445 # Shapes of a1, a2 and masks are guaranteed to be consistent by this point
2446 return bool(asarray(a1[~a1nan] == a2[~a1nan]).all())
2447
2448
2449def _array_equiv_dispatcher(a1, a2):
2450 return (a1, a2)
2451
2452
2453@array_function_dispatch(_array_equiv_dispatcher)
2454def array_equiv(a1, a2):
2455 """
2456 Returns True if input arrays are shape consistent and all elements equal.
2457
2458 Shape consistent means they are either the same shape, or one input array
2459 can be broadcasted to create the same shape as the other one.
2460
2461 Parameters
2462 ----------
2463 a1, a2 : array_like
2464 Input arrays.
2465
2466 Returns
2467 -------
2468 out : bool
2469 True if equivalent, False otherwise.
2470
2471 Examples
2472 --------
2473 >>> np.array_equiv([1, 2], [1, 2])
2474 True
2475 >>> np.array_equiv([1, 2], [1, 3])
2476 False
2477
2478 Showing the shape equivalence:
2479
2480 >>> np.array_equiv([1, 2], [[1, 2], [1, 2]])
2481 True
2482 >>> np.array_equiv([1, 2], [[1, 2, 1, 2], [1, 2, 1, 2]])
2483 False
2484
2485 >>> np.array_equiv([1, 2], [[1, 2], [1, 3]])
2486 False
2487
2488 """
2489 try:
2490 a1, a2 = asarray(a1), asarray(a2)
2491 except Exception:
2492 return False
2493 try:
2494 multiarray.broadcast(a1, a2)
2495 except Exception:
2496 return False
2497
2498 return bool(asarray(a1 == a2).all())
2499
2500
2501Inf = inf = infty = Infinity = PINF
2502nan = NaN = NAN
2503False_ = bool_(False)
2504True_ = bool_(True)
2505
2506
2507def extend_all(module):
2508 existing = set(__all__)
2509 mall = getattr(module, '__all__')
2510 for a in mall:
2511 if a not in existing:
2512 __all__.append(a)
2513
2514
2515from .umath import *
2516from .numerictypes import *
2517from . import fromnumeric
2518from .fromnumeric import *
2519from . import arrayprint
2520from .arrayprint import *
2521from . import _asarray
2522from ._asarray import *
2523from . import _ufunc_config
2524from ._ufunc_config import *
2525extend_all(fromnumeric)
2526extend_all(umath)
2527extend_all(numerictypes)
2528extend_all(arrayprint)
2529extend_all(_asarray)
2530extend_all(_ufunc_config)