Everyone learns differently, and for something like Python that's meant to be so organic and intuitive and more of a friendly wrapper or interface for huge chunks of compiled code that is community supported and tested, you may find that once you get the hang of Python's basic premise - everything is an object, and it's the object's attributes called methods that do stuff - then you may find you can put the book down, and just start trying things.
When you get stuck, try Python's incredibly useful help(object.attribute) for usually quite helpful documentation, or go to the online documentation for the package you are using which should be about the same.
I probably type
import numpy as np
import matplotlib.pyplot as plt
import scipy.special as spe
from scipy.optimize import minimize
several times a day.
Want to diagonalize a matrix? Type help(np.linalg.eig).
Want to minimize? Type help(minimize).
Need a specific kind of Bessel function or elliptic integral, type help(scipy.special)
The first hurdle is that everything is an object. There is a moment where it makes no sense, then suddenly it becomes easy and intuitive.
The second hurdle is numpy arrays. Numpy also has matrix objects, but a lot of the time we actually need n-dimensional arrays. Numpy's arrays can do amazing things with indexing and broadcasting, so go straight to those chapters first.
The third hurdle is to learn to read and trust the verbose and (usually) very helpful error messages. We all make syntax errors regularly, or mix dimensions of arrays. When you see an error message, treat it as a trusted friend. Embrace it, and read through carefully. If you don't understand the error message, paste the key part into a Google search and you will immediately see how other people solved the same problem!
Despite the title, you may find that Jake VanderPlas' Python Data Science Handbook has some explanations (especially for Numpy) that are very accessible and get you started quickly.
I think that once you start playing with Python and especially reading documentation and error messages, you'll put the book down and just dig in in your own, unique learning-style way.
Here's an example of something I got from one of Jake's blogpost in my answer to How do I create a 3D line plot in matplotlib from the data in arrays?
Here is the Lorenz attractor both in 3D and animated...

Here is a minimal, simplified example of plotting lines in 3D based on the above:
def lorentz_deriv((x, y, z), t0, sigma=10., beta=8./3, rho=28.0):
"""Compute the time-derivative of a Lorentz system."""
return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.integrate import odeint as ODEint
x = np.linspace(0, 20, 1000)
y, z = 10.*np.cos(x), 10.*np.sin(x) # something simple
fig = plt.figure()
ax = fig.add_subplot(1,2,1,projection='3d')
ax.plot(x, y, z)
# now Lorentz
times = np.linspace(0, 4, 1000)
start_pts = 30. - 15.*np.random.random((20,3)) # 20 random xyz starting values
trajectories = []
for start_pt in start_pts:
trajectory = ODEint(lorentz_deriv, start_pt, times)
trajectories.append(trajectory)
ax = fig.add_subplot(1,2,2,projection='3d')
for trajectory in trajectories:
x, y, z = trajectory.T # transpose and unpack
# x, y, z = zip(*trajectory) # this also works!
ax.plot(x, y, z)
plt.show()