ó 2ÄÈ[c@`s²ddlmZmZmZddlZddljjZddlm Z m Z m Z m Z m Z mZddlmZmZmZddlmZddlmZmZddlmZddlmZd d d d d dddddddddddgZd„Zd„Zd„Zd„Z d„Z!d„Z"eZ#d„Z$d „Z%d!„Z&dd"„Z'dd#„Z(d$„Z)d%„Z*d&„Z+d'„Z,d(„Z-d)„Z.d*„Z/dS(+i(tdivisiontabsolute_importtprint_functionN(tasarraytzerostoutert concatenatetarrayt asanyarray(tproducttreshapet transpose(tnormalize_axis_index(tvstackt atleast_3d(tndindex(tmatrixt column_stackt row_stacktdstackt array_splittsplitthsplittvsplittdsplittapply_over_axest expand_dimstapply_along_axistkronttiletget_array_wrapttake_along_axistput_along_axisc C`stj|jtjƒs'tdƒ‚nt|ƒ|jkrKtdƒ‚nd|j}tt |ƒƒdgtt |d|jƒƒ}g}xrt ||ƒD]a\}}|dkrÉ|j |ƒq¡|| d||d}|j tj |ƒj|ƒƒq¡Wt|ƒS(Ns"`indices` must be an integer arrays;`indices` and `arr` must have the same number of dimensionsiiÿÿÿÿ(i(iÿÿÿÿ(t_nxt issubdtypetdtypetintegert IndexErrortlentndimt ValueErrortlisttrangetNonetziptappendtarangeR ttuple( t arr_shapetindicestaxist shape_onest dest_dimst fancy_indextdimtnt ind_shape((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyt_make_along_axis_idxs  3 #cC`s\|dkr-|j}t|ƒf}d}nt||jƒ}|j}|t|||ƒS(sœ Take values from the input array by matching 1d index and data slices. This iterates over matching 1d slices oriented along the specified axis in the index and data arrays, and uses the former to look up values in the latter. These slices can be different lengths. Functions returning an index along an axis, like `argsort` and `argpartition`, produce suitable indices for this function. .. versionadded:: 1.15.0 Parameters ---------- arr: ndarray (Ni..., M, Nk...) Source array indices: ndarray (Ni..., J, Nk...) Indices to take along each 1d slice of `arr`. This must match the dimension of arr, but dimensions Ni and Nj only need to broadcast against `arr`. axis: int The axis to take 1d slices along. If axis is None, the input array is treated as if it had first been flattened to 1d, for consistency with `sort` and `argsort`. Returns ------- out: ndarray (Ni..., J, Nk...) The indexed result. Notes ----- This is equivalent to (but faster than) the following use of `ndindex` and `s_`, which sets each of ``ii`` and ``kk`` to a tuple of indices:: Ni, M, Nk = a.shape[:axis], a.shape[axis], a.shape[axis+1:] J = indices.shape[axis] # Need not equal M out = np.empty(Nk + (J,) + Nk) for ii in ndindex(Ni): for kk in ndindex(Nk): a_1d = a [ii + s_[:,] + kk] indices_1d = indices[ii + s_[:,] + kk] out_1d = out [ii + s_[:,] + kk] for j in range(J): out_1d[j] = a_1d[indices_1d[j]] Equivalently, eliminating the inner loop, the last two lines would be:: out_1d[:] = a_1d[indices_1d] See Also -------- take : Take along an axis, using the same indices for every 1d slice put_along_axis : Put values into the destination array by matching 1d index and data slices Examples -------- For this sample array >>> a = np.array([[10, 30, 20], [60, 40, 50]]) We can sort either by using sort directly, or argsort and this function >>> np.sort(a, axis=1) array([[10, 20, 30], [40, 50, 60]]) >>> ai = np.argsort(a, axis=1); ai array([[0, 2, 1], [1, 2, 0]], dtype=int64) >>> np.take_along_axis(a, ai, axis=1) array([[10, 20, 30], [40, 50, 60]]) The same works for max and min, if you expand the dimensions: >>> np.expand_dims(np.max(a, axis=1), axis=1) array([[30], [60]]) >>> ai = np.expand_dims(np.argmax(a, axis=1), axis=1) >>> ai array([[1], [0], dtype=int64) >>> np.take_along_axis(a, ai, axis=1) array([[30], [60]]) If we want to get the max and min at the same time, we can stack the indices first >>> ai_min = np.expand_dims(np.argmin(a, axis=1), axis=1) >>> ai_max = np.expand_dims(np.argmax(a, axis=1), axis=1) >>> ai = np.concatenate([ai_min, ai_max], axis=axis) >> ai array([[0, 1], [1, 0]], dtype=int64) >>> np.take_along_axis(a, ai, axis=1) array([[10, 30], [40, 60]]) iN(R+tflatR&R R'tshapeR9(tarrR1R2R0((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR/sh    cC`sb|dkr-|j}d}t|ƒf}nt||jƒ}|j}||t|||ƒ>> a = np.array([[10, 30, 20], [60, 40, 50]]) We can replace the maximum values with: >>> ai = np.expand_dims(np.argmax(a, axis=1), axis=1) >>> ai array([[1], [0]], dtype=int64) >>> np.put_along_axis(a, ai, 99, axis=1) >>> a array([[10, 99, 20], [99, 40, 50]]) iN(R+R:R&R R'R;R9(R<R1tvaluesR2R0((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR £sI   cO`sát|ƒ}|j}t||ƒ}tt|ƒƒ}t||| ||d|gƒ}t|jd ƒ}d„|Dƒ}yt|ƒ} Wnt k r®t dƒ‚nXt||| ||Žƒ} t |jd | j| j ƒ} tt| jƒƒ} | d|!| | j| j| j!| || j| j!} t | tƒs[| j| ƒ} n| | | (Nj...) This function should accept 1-D arrays. It is applied to 1-D slices of `arr` along the specified axis. axis : integer Axis along which `arr` is sliced. arr : ndarray (Ni..., M, Nk...) Input array. args : any Additional arguments to `func1d`. kwargs : any Additional named arguments to `func1d`. .. versionadded:: 1.9.0 Returns ------- out : ndarray (Ni..., Nj..., Nk...) The output array. The shape of `out` is identical to the shape of `arr`, except along the `axis` dimension. This axis is removed, and replaced with new dimensions equal to the shape of the return value of `func1d`. So if `func1d` returns a scalar `out` will have one fewer dimensions than `arr`. See Also -------- apply_over_axes : Apply a function repeatedly over multiple axes. Examples -------- >>> def my_func(a): ... """Average first and last element of a 1-D array""" ... return (a[0] + a[-1]) * 0.5 >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> np.apply_along_axis(my_func, 0, b) array([ 4., 5., 6.]) >>> np.apply_along_axis(my_func, 1, b) array([ 2., 5., 8.]) For a function that returns a 1D array, the number of dimensions in `outarr` is the same as `arr`. >>> b = np.array([[8,1,7], [4,3,9], [5,2,6]]) >>> np.apply_along_axis(sorted, 1, b) array([[1, 7, 8], [3, 4, 9], [2, 5, 6]]) For a function that returns a higher dimensional array, those dimensions are inserted in place of the `axis` dimension. >>> b = np.array([[1,2,3], [4,5,6], [7,8,9]]) >>> np.apply_along_axis(np.diag, -1, b) array([[[1, 0, 0], [0, 2, 0], [0, 0, 3]], [[4, 0, 0], [0, 5, 0], [0, 0, 6]], [[7, 0, 0], [0, 8, 0], [0, 0, 9]]]) iiÿÿÿÿcs`s|]}|tfVqdS(N(tEllipsis(t.0tind((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pys ^ss;Cannot apply_along_axis when any iteration dimensions are 0iN(RR'R R)R*R RR;tnextt StopIterationR(RR#t isinstanceRt__array_prepare__t__array_wrap__(tfunc1dR2R<targstkwargstndtin_dimst inarr_viewtindstind0trestbufft buff_dimst buff_permuteR@tout_arr((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRøs4[  &  "  $ cC`sÍt|ƒ}|j}t|ƒjdkr6|f}nx|D]ˆ}|dkr\||}n||f}||Œ}|j|jkr|}q=t||ƒ}|j|jkr¹|}q=tdƒ‚q=W|S(sz Apply a function repeatedly over multiple axes. `func` is called as `res = func(a, axis)`, where `axis` is the first element of `axes`. The result `res` of the function call must have either the same dimensions as `a` or one less dimension. If `res` has one less dimension than `a`, a dimension is inserted before `axis`. The call to `func` is then repeated for each axis in `axes`, with `res` as the first argument. Parameters ---------- func : function This function must take two arguments, `func(a, axis)`. a : array_like Input array. axes : array_like Axes over which `func` is applied; the elements must be integers. Returns ------- apply_over_axis : ndarray The output array. The number of dimensions is the same as `a`, but the shape can be different. This depends on whether `func` changes the shape of its output with respect to its input. See Also -------- apply_along_axis : Apply a function to 1-D slices of an array along the given axis. Notes ------ This function is equivalent to tuple axis arguments to reorderable ufuncs with keepdims=True. Tuple axis arguments to ufuncs have been available since version 1.7.0. Examples -------- >>> a = np.arange(24).reshape(2,3,4) >>> a array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]]) Sum over axes 0 and 2. The result has same number of dimensions as the original array: >>> np.apply_over_axes(np.sum, a, [0,2]) array([[[ 60], [ 92], [124]]]) Tuple axis arguments to ufuncs are equivalent: >>> np.sum(a, axis=(0,2), keepdims=True) array([[[ 60], [ 92], [124]]]) is7function is not returning an array of the correct shape(RR'RRR((tfunctataxestvaltNR2RGRN((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR‹s A          cC`sŽt|ƒ}|j}||jks8||j dkrQtjdtddƒn|dkrq||jd}n|j|| d||ƒS(s¥ Expand the shape of an array. Insert a new axis that will appear at the `axis` position in the expanded array shape. .. note:: Previous to NumPy 1.13.0, neither ``axis < -a.ndim - 1`` nor ``axis > a.ndim`` raised errors or put the new axis where documented. Those axis values are now deprecated and will raise an AxisError in the future. Parameters ---------- a : array_like Input array. axis : int Position in the expanded axes where the new axis is placed. Returns ------- res : ndarray Output array. The number of dimensions is one greater than that of the input array. See Also -------- squeeze : The inverse operation, removing singleton dimensions reshape : Insert, remove, and combine dimensions, and resize existing ones doc.indexing, atleast_1d, atleast_2d, atleast_3d Examples -------- >>> x = np.array([1,2]) >>> x.shape (2,) The following is equivalent to ``x[np.newaxis,:]`` or ``x[np.newaxis]``: >>> y = np.expand_dims(x, axis=0) >>> y array([[1, 2]]) >>> y.shape (1, 2) >>> y = np.expand_dims(x, axis=1) # Equivalent to x[:,np.newaxis] >>> y array([[1], [2]]) >>> y.shape (2, 1) Note that some examples may use ``None`` instead of ``np.newaxis``. These are the same objects: >>> np.newaxis is None True iscBoth axis > a.ndim and axis < -a.ndim - 1 are deprecated and will raise an AxisError in the future.t stacklevelii(i(RR;R'twarningstwarntDeprecationWarningR (RTR2R;((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRàs;  #  c C`sg}xf|D]^}t|dtdtƒ}|jdkr^t|dtdtddƒj}n|j|ƒq Wtj|dƒS(sî Stack 1-D arrays as columns into a 2-D array. Take a sequence of 1-D arrays and stack them as columns to make a single 2-D array. 2-D arrays are stacked as-is, just like with `hstack`. 1-D arrays are turned into 2-D columns first. Parameters ---------- tup : sequence of 1-D or 2-D arrays. Arrays to stack. All of them must have the same first dimension. Returns ------- stacked : 2-D array The array formed by stacking the given arrays. See Also -------- stack, hstack, vstack, concatenate Examples -------- >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.column_stack((a,b)) array([[1, 2], [2, 3], [3, 4]]) tcopytsubokitndmini(RtFalsetTrueR'tTR-R!R(ttuptarraystvR<((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR+s! $cC`s)tjg|D]}t|ƒ^q dƒS(sö Stack arrays in sequence depth wise (along third axis). This is equivalent to concatenation along the third axis after 2-D arrays of shape `(M,N)` have been reshaped to `(M,N,1)` and 1-D arrays of shape `(N,)` have been reshaped to `(1,N,1)`. Rebuilds arrays divided by `dsplit`. This function makes most sense for arrays with up to 3 dimensions. For instance, for pixel-data with a height (first axis), width (second axis), and r/g/b channels (third axis). The functions `concatenate`, `stack` and `block` provide more general stacking and concatenation operations. Parameters ---------- tup : sequence of arrays The arrays must have the same shape along all but the third axis. 1-D or 2-D arrays must have the same shape. Returns ------- stacked : ndarray The array formed by stacking the given arrays, will be at least 3-D. See Also -------- stack : Join a sequence of arrays along a new axis. vstack : Stack along first axis. hstack : Stack along second axis. concatenate : Join a sequence of arrays along an existing axis. dsplit : Split array along third axis. Examples -------- >>> a = np.array((1,2,3)) >>> b = np.array((2,3,4)) >>> np.dstack((a,b)) array([[[1, 2], [2, 3], [3, 4]]]) >>> a = np.array([[1],[2],[3]]) >>> b = np.array([[2],[3],[4]]) >>> np.dstack((a,b)) array([[[1, 2]], [[2, 3]], [[3, 4]]]) i(R!RR(Rbt_m((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRTs2cC`s¨x¡tt|ƒƒD]}tj||ƒdkrUtjdd||jƒ||>> x = np.arange(8.0) >>> np.array_split(x, 3) [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])] >>> x = np.arange(7.0) >>> np.array_split(x, 3) [array([ 0., 1., 2.]), array([ 3., 4.]), array([ 5., 6.])] iis&number sections must be larger than 0.(R;tAttributeErrorR&R)t TypeErrortintR(tdivmodR!RtcumsumtswapaxesR*R-(tarytindices_or_sectionsR2tNtotalt Nsectionst div_pointst Neach_sectiontextrast section_sizesRitsaryRjtsttend((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRs,     'cC`sdyt|ƒWn=tk rM|}|j|}||rNtdƒ‚qNnXt|||ƒ}|S(s Split an array into multiple sub-arrays. Parameters ---------- ary : ndarray Array to be divided into sub-arrays. indices_or_sections : int or 1-D array If `indices_or_sections` is an integer, N, the array will be divided into N equal arrays along `axis`. If such a split is not possible, an error is raised. If `indices_or_sections` is a 1-D array of sorted integers, the entries indicate where along `axis` the array is split. For example, ``[2, 3]`` would, for ``axis=0``, result in - ary[:2] - ary[2:3] - ary[3:] If an index exceeds the dimension of the array along `axis`, an empty sub-array is returned correspondingly. axis : int, optional The axis along which to split, default is 0. Returns ------- sub-arrays : list of ndarrays A list of sub-arrays. Raises ------ ValueError If `indices_or_sections` is given as an integer, but a split does not result in equal division. See Also -------- array_split : Split an array into multiple sub-arrays of equal or near-equal size. Does not raise an exception if an equal division cannot be made. hsplit : Split array into multiple sub-arrays horizontally (column-wise). vsplit : Split array into multiple sub-arrays vertically (row wise). dsplit : Split array into multiple sub-arrays along the 3rd axis (depth). concatenate : Join a sequence of arrays along an existing axis. stack : Join a sequence of arrays along a new axis. hstack : Stack arrays in sequence horizontally (column wise). vstack : Stack arrays in sequence vertically (row wise). dstack : Stack arrays in sequence depth wise (along third dimension). Examples -------- >>> x = np.arange(9.0) >>> np.split(x, 3) [array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7., 8.])] >>> x = np.arange(8.0) >>> np.split(x, [3, 5, 6, 10]) [array([ 0., 1., 2.]), array([ 3., 4.]), array([ 5.]), array([ 6., 7.]), array([], dtype=float64)] s0array split does not result in an equal division(R&RmR;R(R(RrRsR2tsectionsRWRN((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRÇsB   cC`sWtj|ƒdkr$tdƒ‚n|jdkrCt||dƒSt||dƒSdS(s´ Split an array into multiple sub-arrays horizontally (column-wise). Please refer to the `split` documentation. `hsplit` is equivalent to `split` with ``axis=1``, the array is always split along the second axis regardless of the array dimension. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(4, 4) >>> x array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]) >>> np.hsplit(x, 2) [array([[ 0., 1.], [ 4., 5.], [ 8., 9.], [ 12., 13.]]), array([[ 2., 3.], [ 6., 7.], [ 10., 11.], [ 14., 15.]])] >>> np.hsplit(x, np.array([3, 6])) [array([[ 0., 1., 2.], [ 4., 5., 6.], [ 8., 9., 10.], [ 12., 13., 14.]]), array([[ 3.], [ 7.], [ 11.], [ 15.]]), array([], dtype=float64)] With a higher dimensional array the split is still along the second axis. >>> x = np.arange(8.0).reshape(2, 2, 2) >>> x array([[[ 0., 1.], [ 2., 3.]], [[ 4., 5.], [ 6., 7.]]]) >>> np.hsplit(x, 2) [array([[[ 0., 1.]], [[ 4., 5.]]]), array([[[ 2., 3.]], [[ 6., 7.]]])] is3hsplit only works on arrays of 1 or more dimensionsiN(R!R'R(R(RrRs((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRs 7cC`s4tj|ƒdkr$tdƒ‚nt||dƒS(sI Split an array into multiple sub-arrays vertically (row-wise). Please refer to the ``split`` documentation. ``vsplit`` is equivalent to ``split`` with `axis=0` (default), the array is always split along the first axis regardless of the array dimension. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(4, 4) >>> x array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]) >>> np.vsplit(x, 2) [array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.]]), array([[ 8., 9., 10., 11.], [ 12., 13., 14., 15.]])] >>> np.vsplit(x, np.array([3, 6])) [array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]), array([[ 12., 13., 14., 15.]]), array([], dtype=float64)] With a higher dimensional array the split is still along the first axis. >>> x = np.arange(8.0).reshape(2, 2, 2) >>> x array([[[ 0., 1.], [ 2., 3.]], [[ 4., 5.], [ 6., 7.]]]) >>> np.vsplit(x, 2) [array([[[ 0., 1.], [ 2., 3.]]]), array([[[ 4., 5.], [ 6., 7.]]])] is3vsplit only works on arrays of 2 or more dimensionsi(R!R'R(R(RrRs((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRRs/cC`s4tj|ƒdkr$tdƒ‚nt||dƒS(s Split array into multiple sub-arrays along the 3rd axis (depth). Please refer to the `split` documentation. `dsplit` is equivalent to `split` with ``axis=2``, the array is always split along the third axis provided the array dimension is greater than or equal to 3. See Also -------- split : Split an array into multiple sub-arrays of equal size. Examples -------- >>> x = np.arange(16.0).reshape(2, 2, 4) >>> x array([[[ 0., 1., 2., 3.], [ 4., 5., 6., 7.]], [[ 8., 9., 10., 11.], [ 12., 13., 14., 15.]]]) >>> np.dsplit(x, 2) [array([[[ 0., 1.], [ 4., 5.]], [[ 8., 9.], [ 12., 13.]]]), array([[[ 2., 3.], [ 6., 7.]], [[ 10., 11.], [ 14., 15.]]])] >>> np.dsplit(x, np.array([3, 6])) [array([[[ 0., 1., 2.], [ 4., 5., 6.]], [[ 8., 9., 10.], [ 12., 13., 14.]]]), array([[[ 3.], [ 7.]], [[ 11.], [ 15.]]]), array([], dtype=float64)] is3dsplit only works on arrays of 3 or more dimensionsi(R!R'R(R(RrRs((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR…s)cG`s2td„t|ƒDƒƒ}|r.|ddSdS(s‡Find the wrapper for the array with the highest priority. In case of ties, leftmost wins. If no wrapper is found, return None cs`sC|]9\}}t|dƒrt|ddƒ| |jfVqdS(RDt__array_priority__iN(thasattrtgetattrRD(R?Rjtx((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pys ·s iÿÿÿÿN(tsortedt enumerateR+(RGtwrappers((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pytget_array_prepare²s   cG`s2td„t|ƒDƒƒ}|r.|ddSdS(s‡Find the wrapper for the array with the highest priority. In case of ties, leftmost wins. If no wrapper is found, return None cs`sC|]9\}}t|dƒrt|ddƒ| |jfVqdS(RER~iN(RR€RE(R?RjR((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pys Ãs iÿÿÿÿN(R‚RƒR+(RGR„((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR¾s   c C`s«t|ƒ}t|dtdtd|jƒ}|j|j}}|dksX|dkrhtj||ƒS|j}|j}|jj s˜t ||ƒ}n|jj s¶t ||ƒ}n|}||kr||kréd|||}qd|||}|}nt ||ƒj ||ƒ}|d}x&t |ƒD]} t |d|ƒ}q7Wt||ƒ} | d k r}| |ƒ}nt||ƒ} | d k r§| |ƒ}n|S( s Kronecker product of two arrays. Computes the Kronecker product, a composite array made of blocks of the second array scaled by the first. Parameters ---------- a, b : array_like Returns ------- out : ndarray See Also -------- outer : The outer product Notes ----- The function assumes that the number of dimensions of `a` and `b` are the same, if necessary prepending the smallest with ones. If `a.shape = (r0,r1,..,rN)` and `b.shape = (s0,s1,...,sN)`, the Kronecker product has shape `(r0*s0, r1*s1, ..., rN*SN)`. The elements are products of elements from `a` and `b`, organized explicitly by:: kron(a,b)[k0,k1,...,kN] = a[i0,i1,...,iN] * b[j0,j1,...,jN] where:: kt = it * st + jt, t = 0,...,N In the common 2-D case (N=1), the block structure can be visualized:: [[ a[0,0]*b, a[0,1]*b, ... , a[0,-1]*b ], [ ... ... ], [ a[-1,0]*b, a[-1,1]*b, ... , a[-1,-1]*b ]] Examples -------- >>> np.kron([1,10,100], [5,6,7]) array([ 5, 6, 7, 50, 60, 70, 500, 600, 700]) >>> np.kron([5,6,7], [1,10,100]) array([ 5, 50, 500, 6, 60, 600, 7, 70, 700]) >>> np.kron(np.eye(2), np.ones((2,2))) array([[ 1., 1., 0., 0.], [ 1., 1., 0., 0.], [ 0., 0., 1., 1.], [ 0., 0., 1., 1.]]) >>> a = np.arange(100).reshape((2,5,2,5)) >>> b = np.arange(24).reshape((2,3,4)) >>> c = np.kron(a,b) >>> c.shape (2, 10, 6, 20) >>> I = (1,3,0,2) >>> J = (0,2,1) >>> J1 = (0,) + J # extend to ndim=4 >>> S1 = (1,) + b.shape >>> K = tuple(np.array(I) * np.array(S1) + np.array(J1)) >>> c[K] == a[I]*b[J] True R\R]R^iiR2(i(iN(RRR_R`R'R!tmultiplyR;tflagst contiguousR RR*RR…R+R( RTtbtndbtndatas_tbsRItresultR2t_twrapper((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyRÊs8D !          c C`siyt|ƒ}Wntk r,|f}nXt|ƒ}td„|Dƒƒr€t|tjƒr€tj|dtdtd|ƒStj|dt dtd|ƒ}||j krÈd |j ||}ntd„t |j |ƒDƒƒ}|j }|dkr\xZt |j |ƒD]C\}}|dkrK|jd|ƒj|dƒ}n||}qWn|j|ƒS( s Construct an array by repeating A the number of times given by reps. If `reps` has length ``d``, the result will have dimension of ``max(d, A.ndim)``. If ``A.ndim < d``, `A` is promoted to be d-dimensional by prepending new axes. So a shape (3,) array is promoted to (1, 3) for 2-D replication, or shape (1, 1, 3) for 3-D replication. If this is not the desired behavior, promote `A` to d-dimensions manually before calling this function. If ``A.ndim > d``, `reps` is promoted to `A`.ndim by pre-pending 1's to it. Thus for an `A` of shape (2, 3, 4, 5), a `reps` of (2, 2) is treated as (1, 1, 2, 2). Note : Although tile may be used for broadcasting, it is strongly recommended to use numpy's broadcasting operations and functions. Parameters ---------- A : array_like The input array. reps : array_like The number of repetitions of `A` along each axis. Returns ------- c : ndarray The tiled output array. See Also -------- repeat : Repeat elements of an array. broadcast_to : Broadcast an array to a new shape Examples -------- >>> a = np.array([0, 1, 2]) >>> np.tile(a, 2) array([0, 1, 2, 0, 1, 2]) >>> np.tile(a, (2, 2)) array([[0, 1, 2, 0, 1, 2], [0, 1, 2, 0, 1, 2]]) >>> np.tile(a, (2, 1, 2)) array([[[0, 1, 2, 0, 1, 2]], [[0, 1, 2, 0, 1, 2]]]) >>> b = np.array([[1, 2], [3, 4]]) >>> np.tile(b, 2) array([[1, 2, 1, 2], [3, 4, 3, 4]]) >>> np.tile(b, (2, 1)) array([[1, 2], [3, 4], [1, 2], [3, 4]]) >>> c = np.array([1,2,3,4]) >>> np.tile(c,(4,1)) array([[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]) cs`s|]}|dkVqdS(iN((R?R((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pys tsR\R]R^ics`s|]\}}||VqdS(N((R?tstt((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pys ~siiÿÿÿÿ(i(R/RmR&tallRCR!tndarrayRR`R_R'R,R;tsizeR trepeat( tAtrepsRbtdtct shape_outR7tdim_intnrep((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyR-s$B   (!"   !(0t __future__RRRRYtnumpy.core.numerictcoretnumericR!RRRRRRtnumpy.core.fromnumericR R R tnumpy.core.multiarrayR t numpy.coreR Rtnumpy.lib.index_tricksRtnumpy.matrixlib.defmatrixRt__all__R9RR RRRRRRRkRRRRRR…RRR(((s3/tmp/pip-build-fiC0ax/numpy/numpy/lib/shape_base.pyts> .   t U “ U I ) 4  7 M > 3 - c