|
148 | 148 | },
|
149 | 149 | {
|
150 | 150 | "cell_type": "code",
|
151 |
| - "execution_count": 42, |
| 151 | + "execution_count": 46, |
152 | 152 | "metadata": {
|
153 | 153 | "hideCode": false,
|
154 | 154 | "hidePrompt": false
|
|
163 | 163 | " [ 30., 30., 30.]])"
|
164 | 164 | ]
|
165 | 165 | },
|
166 |
| - "execution_count": 42, |
| 166 | + "execution_count": 46, |
167 | 167 | "metadata": {},
|
168 | 168 | "output_type": "execute_result"
|
169 | 169 | }
|
|
176 | 176 | },
|
177 | 177 | {
|
178 | 178 | "cell_type": "code",
|
179 |
| - "execution_count": 43, |
| 179 | + "execution_count": 47, |
180 | 180 | "metadata": {
|
181 | 181 | "hideCode": false,
|
182 | 182 | "hidePrompt": false
|
|
188 | 188 | "array([ 1., 2., 3.])"
|
189 | 189 | ]
|
190 | 190 | },
|
191 |
| - "execution_count": 43, |
| 191 | + "execution_count": 47, |
192 | 192 | "metadata": {},
|
193 | 193 | "output_type": "execute_result"
|
194 | 194 | }
|
|
200 | 200 | },
|
201 | 201 | {
|
202 | 202 | "cell_type": "code",
|
203 |
| - "execution_count": 44, |
| 203 | + "execution_count": 48, |
204 | 204 | "metadata": {
|
205 | 205 | "hideCode": false,
|
206 | 206 | "hidePrompt": false
|
|
215 | 215 | " [ 31., 32., 33.]])"
|
216 | 216 | ]
|
217 | 217 | },
|
218 |
| - "execution_count": 44, |
| 218 | + "execution_count": 48, |
219 | 219 | "metadata": {},
|
220 | 220 | "output_type": "execute_result"
|
221 | 221 | }
|
|
236 | 236 | "A 2-D (two-dimensional) array multiplied by 1-D (one-dimensional) array. It got stretched in the column direction so as to match the elements of the 2D array columns.\n",
|
237 | 237 | "<img src=\"figures/broadcast_strectch2.gif\">\n",
|
238 | 238 | "\n",
|
239 |
| - "### Can we do the above operation any faster?\n", |
| 239 | + "Would the same be possible for different shapes? Does broadcasting magically understands and fixes our assumptions?\n", |
240 | 240 | "\n",
|
241 |
| - "Like is one line?\n", |
| 241 | + "Let's take a look...\n", |
| 242 | + "\n" |
| 243 | + ] |
| 244 | + }, |
| 245 | + { |
| 246 | + "cell_type": "code", |
| 247 | + "execution_count": 53, |
| 248 | + "metadata": {}, |
| 249 | + "outputs": [ |
| 250 | + { |
| 251 | + "ename": "ValueError", |
| 252 | + "evalue": "operands could not be broadcast together with shapes (4,3) (4,) ", |
| 253 | + "output_type": "error", |
| 254 | + "traceback": [ |
| 255 | + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", |
| 256 | + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", |
| 257 | + "\u001b[0;32m<ipython-input-53-baf25e1d8c2c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mg\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m10.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m20.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m20.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m20.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m30.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m30.0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m30.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3.0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mg\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", |
| 258 | + "\u001b[0;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,3) (4,) " |
| 259 | + ] |
| 260 | + } |
| 261 | + ], |
| 262 | + "source": [ |
| 263 | + "g = np.array([[ 0.0, 0.0, 0.0], [10.0,10.0,10.0],[20.0,20.0,20.0],[30.0,30.0,30.0]])\n", |
| 264 | + "i = np.array([0.0, 1.0, 2.0, 3.0])\n", |
| 265 | + "g+i " |
| 266 | + ] |
| 267 | + }, |
| 268 | + { |
| 269 | + "cell_type": "markdown", |
| 270 | + "metadata": {}, |
| 271 | + "source": [ |
| 272 | + "### We had a mismatch...\n", |
| 273 | + "\n", |
| 274 | + "<img src=\"figures/broadcast_strectch3.gif\">\n", |
| 275 | + "\n", |
| 276 | + "Explanation: When the trainling dimensions of the arrays are different as you saw above, then broadcasting will fail making it impossible to align the values in the rows of the first array with the elements of the second array for an **element-by-element** addition or multiplication.\n", |
242 | 277 | "\n",
|
243 |
| - "Let's try np.tile and np.arange" |
| 278 | + "### Also, is there a way to do this in one line of code\n", |
| 279 | + "\n", |
| 280 | + "Tip: look up more into np.tile and np.arange" |
244 | 281 | ]
|
245 | 282 | },
|
246 | 283 | {
|
247 | 284 | "cell_type": "code",
|
248 |
| - "execution_count": 10, |
| 285 | + "execution_count": 60, |
249 | 286 | "metadata": {
|
250 | 287 | "hideCode": false,
|
251 | 288 | "hidePrompt": false
|
|
260 | 297 | " [30, 30, 30]])"
|
261 | 298 | ]
|
262 | 299 | },
|
263 |
| - "execution_count": 10, |
| 300 | + "execution_count": 60, |
264 | 301 | "metadata": {},
|
265 | 302 | "output_type": "execute_result"
|
266 | 303 | }
|
|
273 | 310 | },
|
274 | 311 | {
|
275 | 312 | "cell_type": "code",
|
276 |
| - "execution_count": 11, |
| 313 | + "execution_count": 57, |
277 | 314 | "metadata": {
|
278 | 315 | "hideCode": false,
|
279 | 316 | "hidePrompt": false
|
|
285 | 322 | "array([0, 1, 2])"
|
286 | 323 | ]
|
287 | 324 | },
|
288 |
| - "execution_count": 11, |
| 325 | + "execution_count": 57, |
289 | 326 | "metadata": {},
|
290 | 327 | "output_type": "execute_result"
|
291 | 328 | }
|
|
307 | 344 | },
|
308 | 345 | {
|
309 | 346 | "cell_type": "code",
|
310 |
| - "execution_count": 13, |
| 347 | + "execution_count": 58, |
311 | 348 | "metadata": {
|
312 | 349 | "hideCode": false,
|
313 | 350 | "hidePrompt": false
|
|
322 | 359 | " [30, 31, 32]])"
|
323 | 360 | ]
|
324 | 361 | },
|
325 |
| - "execution_count": 13, |
| 362 | + "execution_count": 58, |
326 | 363 | "metadata": {},
|
327 | 364 | "output_type": "execute_result"
|
328 | 365 | }
|
|
340 | 377 | "source": [
|
341 | 378 | "##### So you see that broadcasting was applied magically...\n",
|
342 | 379 | "\n",
|
343 |
| - "Ask yourself, why couldn't we add original `a` and `b` ?" |
| 380 | + "Ask yourself, why couldn't we add original `a` and `b` ?\n", |
| 381 | + "\n", |
| 382 | + "Note, original a was:\n", |
| 383 | + "```python\n", |
| 384 | + "array([[ 0, 10, 20, 30],\n", |
| 385 | + " [ 0, 10, 20, 30],\n", |
| 386 | + " [ 0, 10, 20, 30]])\n", |
| 387 | + "```" |
344 | 388 | ]
|
345 | 389 | },
|
346 | 390 | {
|
|
0 commit comments