Created starter files for the project.
This commit is contained in:
		
						commit
						73f0c0db42
					
				
					 1992 changed files with 769897 additions and 0 deletions
				
			
		
							
								
								
									
										180
									
								
								venv/Lib/site-packages/numpy/doc/broadcasting.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								venv/Lib/site-packages/numpy/doc/broadcasting.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,180 @@ | |||
| """ | ||||
| ======================== | ||||
| Broadcasting over arrays | ||||
| ======================== | ||||
| 
 | ||||
| .. note:: | ||||
|     See `this article | ||||
|     <https://numpy.org/devdocs/user/theory.broadcasting.html>`_ | ||||
|     for illustrations of broadcasting concepts. | ||||
| 
 | ||||
| 
 | ||||
| The term broadcasting describes how numpy treats arrays with different | ||||
| shapes during arithmetic operations. Subject to certain constraints, | ||||
| the smaller array is "broadcast" across the larger array so that they | ||||
| have compatible shapes. Broadcasting provides a means of vectorizing | ||||
| array operations so that looping occurs in C instead of Python. It does | ||||
| this without making needless copies of data and usually leads to | ||||
| efficient algorithm implementations. There are, however, cases where | ||||
| broadcasting is a bad idea because it leads to inefficient use of memory | ||||
| that slows computation. | ||||
| 
 | ||||
| NumPy operations are usually done on pairs of arrays on an | ||||
| element-by-element basis.  In the simplest case, the two arrays must | ||||
| have exactly the same shape, as in the following example: | ||||
| 
 | ||||
|   >>> a = np.array([1.0, 2.0, 3.0]) | ||||
|   >>> b = np.array([2.0, 2.0, 2.0]) | ||||
|   >>> a * b | ||||
|   array([ 2.,  4.,  6.]) | ||||
| 
 | ||||
| NumPy's broadcasting rule relaxes this constraint when the arrays' | ||||
| shapes meet certain constraints. The simplest broadcasting example occurs | ||||
| when an array and a scalar value are combined in an operation: | ||||
| 
 | ||||
| >>> a = np.array([1.0, 2.0, 3.0]) | ||||
| >>> b = 2.0 | ||||
| >>> a * b | ||||
| array([ 2.,  4.,  6.]) | ||||
| 
 | ||||
| The result is equivalent to the previous example where ``b`` was an array. | ||||
| We can think of the scalar ``b`` being *stretched* during the arithmetic | ||||
| operation into an array with the same shape as ``a``. The new elements in | ||||
| ``b`` are simply copies of the original scalar. The stretching analogy is | ||||
| only conceptual.  NumPy is smart enough to use the original scalar value | ||||
| without actually making copies so that broadcasting operations are as | ||||
| memory and computationally efficient as possible. | ||||
| 
 | ||||
| The code in the second example is more efficient than that in the first | ||||
| because broadcasting moves less memory around during the multiplication | ||||
| (``b`` is a scalar rather than an array). | ||||
| 
 | ||||
| General Broadcasting Rules | ||||
| ========================== | ||||
| When operating on two arrays, NumPy compares their shapes element-wise. | ||||
| It starts with the trailing dimensions and works its way forward.  Two | ||||
| dimensions are compatible when | ||||
| 
 | ||||
| 1) they are equal, or | ||||
| 2) one of them is 1 | ||||
| 
 | ||||
| If these conditions are not met, a | ||||
| ``ValueError: operands could not be broadcast together`` exception is  | ||||
| thrown, indicating that the arrays have incompatible shapes. The size of  | ||||
| the resulting array is the size that is not 1 along each axis of the inputs. | ||||
| 
 | ||||
| Arrays do not need to have the same *number* of dimensions.  For example, | ||||
| if you have a ``256x256x3`` array of RGB values, and you want to scale | ||||
| each color in the image by a different value, you can multiply the image | ||||
| by a one-dimensional array with 3 values. Lining up the sizes of the | ||||
| trailing axes of these arrays according to the broadcast rules, shows that | ||||
| they are compatible:: | ||||
| 
 | ||||
|   Image  (3d array): 256 x 256 x 3 | ||||
|   Scale  (1d array):             3 | ||||
|   Result (3d array): 256 x 256 x 3 | ||||
| 
 | ||||
| When either of the dimensions compared is one, the other is | ||||
| used.  In other words, dimensions with size 1 are stretched or "copied" | ||||
| to match the other. | ||||
| 
 | ||||
| In the following example, both the ``A`` and ``B`` arrays have axes with | ||||
| length one that are expanded to a larger size during the broadcast | ||||
| operation:: | ||||
| 
 | ||||
|   A      (4d array):  8 x 1 x 6 x 1 | ||||
|   B      (3d array):      7 x 1 x 5 | ||||
|   Result (4d array):  8 x 7 x 6 x 5 | ||||
| 
 | ||||
| Here are some more examples:: | ||||
| 
 | ||||
|   A      (2d array):  5 x 4 | ||||
|   B      (1d array):      1 | ||||
|   Result (2d array):  5 x 4 | ||||
| 
 | ||||
|   A      (2d array):  5 x 4 | ||||
|   B      (1d array):      4 | ||||
|   Result (2d array):  5 x 4 | ||||
| 
 | ||||
|   A      (3d array):  15 x 3 x 5 | ||||
|   B      (3d array):  15 x 1 x 5 | ||||
|   Result (3d array):  15 x 3 x 5 | ||||
| 
 | ||||
|   A      (3d array):  15 x 3 x 5 | ||||
|   B      (2d array):       3 x 5 | ||||
|   Result (3d array):  15 x 3 x 5 | ||||
| 
 | ||||
|   A      (3d array):  15 x 3 x 5 | ||||
|   B      (2d array):       3 x 1 | ||||
|   Result (3d array):  15 x 3 x 5 | ||||
| 
 | ||||
| Here are examples of shapes that do not broadcast:: | ||||
| 
 | ||||
|   A      (1d array):  3 | ||||
|   B      (1d array):  4 # trailing dimensions do not match | ||||
| 
 | ||||
|   A      (2d array):      2 x 1 | ||||
|   B      (3d array):  8 x 4 x 3 # second from last dimensions mismatched | ||||
| 
 | ||||
| An example of broadcasting in practice:: | ||||
| 
 | ||||
|  >>> x = np.arange(4) | ||||
|  >>> xx = x.reshape(4,1) | ||||
|  >>> y = np.ones(5) | ||||
|  >>> z = np.ones((3,4)) | ||||
| 
 | ||||
|  >>> x.shape | ||||
|  (4,) | ||||
| 
 | ||||
|  >>> y.shape | ||||
|  (5,) | ||||
| 
 | ||||
|  >>> x + y | ||||
|  ValueError: operands could not be broadcast together with shapes (4,) (5,) | ||||
| 
 | ||||
|  >>> xx.shape | ||||
|  (4, 1) | ||||
| 
 | ||||
|  >>> y.shape | ||||
|  (5,) | ||||
| 
 | ||||
|  >>> (xx + y).shape | ||||
|  (4, 5) | ||||
| 
 | ||||
|  >>> xx + y | ||||
|  array([[ 1.,  1.,  1.,  1.,  1.], | ||||
|         [ 2.,  2.,  2.,  2.,  2.], | ||||
|         [ 3.,  3.,  3.,  3.,  3.], | ||||
|         [ 4.,  4.,  4.,  4.,  4.]]) | ||||
| 
 | ||||
|  >>> x.shape | ||||
|  (4,) | ||||
| 
 | ||||
|  >>> z.shape | ||||
|  (3, 4) | ||||
| 
 | ||||
|  >>> (x + z).shape | ||||
|  (3, 4) | ||||
| 
 | ||||
|  >>> x + z | ||||
|  array([[ 1.,  2.,  3.,  4.], | ||||
|         [ 1.,  2.,  3.,  4.], | ||||
|         [ 1.,  2.,  3.,  4.]]) | ||||
| 
 | ||||
| Broadcasting provides a convenient way of taking the outer product (or | ||||
| any other outer operation) of two arrays. The following example shows an | ||||
| outer addition operation of two 1-d arrays:: | ||||
| 
 | ||||
|   >>> a = np.array([0.0, 10.0, 20.0, 30.0]) | ||||
|   >>> b = np.array([1.0, 2.0, 3.0]) | ||||
|   >>> a[:, np.newaxis] + b | ||||
|   array([[  1.,   2.,   3.], | ||||
|          [ 11.,  12.,  13.], | ||||
|          [ 21.,  22.,  23.], | ||||
|          [ 31.,  32.,  33.]]) | ||||
| 
 | ||||
| Here the ``newaxis`` index operator inserts a new axis into ``a``, | ||||
| making it a two-dimensional ``4x1`` array.  Combining the ``4x1`` array | ||||
| with ``b``, which has shape ``(3,)``, yields a ``4x3`` array. | ||||
| 
 | ||||
| """ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue