Ch04 NumPy Foundations

Getting Started wiht NumPy

NumPy Array

matrix = [[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]]
[[i + 1 for i in row] for row in matrix]
[[2, 3, 4], [5, 6, 7], [8, 9, 10]]
# First, let's import NumPy
import numpy as np
# Constructing an array with a simple list results in a 1d array
array1 = np.array([10, 100, 1000.])
# Constructing an array with a nested list results in a 2d array
array2 = np.array([[1., 2., 3.],
                   [4., 5., 6.]])
array1.dtype
dtype('float64')
float(array1[0])
10.0

Vectorization and Broadcasting

array2 + 1
array([[2., 3., 4.],
       [5., 6., 7.]])
array2 * array2
array([[ 1.,  4.,  9.],
       [16., 25., 36.]])
array2 * array1
array([[  10.,  200., 3000.],
       [  40.,  500., 6000.]])
array2 @ array2.T  # array2.T is a shortcut for array2.transpose()
array([[14., 32.],
       [32., 77.]])

Universal Functions (ufunc)

import math
math.sqrt(array2)  # This will raise en Error
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-5c37e8f41094> in <module>
----> 1 math.sqrt(array2)  # This will raise en Error

TypeError: only size-1 arrays can be converted to Python scalars
np.array([[math.sqrt(i) for i in row] for row in array2])
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974]])
np.sqrt(array2)
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974]])
array2.sum(axis=0)  # Returns a 1d array
array([5., 7., 9.])
array2.sum()
21.0

Creating and Manipulation Arrays

Getting and Setting Array Elements

array1[2]  # Returns a scalar
1000.0
array2[0, 0]  # Returns a scalar
1.0
array2[:, 1:]  # Returns a 2d array
array([[2., 3.],
       [5., 6.]])
array2[:, 1]  # Returns a 1d array
array([2., 5.])
array2[1, :2]  # Returns a 1d array
array([4., 5.])

Useful Array Constructors

np.arange(2 * 5).reshape(2, 5)  # 2 rows, 5 columns
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
np.random.randn(2, 3)  # 2 rows, 3 columns
array([[-0.45471931, -0.41817296, -0.38933941],
       [ 2.56475263,  0.62193465,  2.01337361]])

View vs. Copy

array2
array([[1., 2., 3.],
       [4., 5., 6.]])
subset = array2[:, :2]
subset
array([[1., 2.],
       [4., 5.]])
subset[0, 0] = 1000
subset
array([[1000.,    2.],
       [   4.,    5.]])
array2
array([[1000.,    2.,    3.],
       [   4.,    5.,    6.]])