0
引言
Numpy 是 Python 专门处理高维数组 (high dimensional array) 的计算的包,每次使用它遇到问题都会它的官网 (www.numpy.org).去找答案。 在使用 numpy以前,须要引进它,语法以下:javascript
import numpy
这样你就能够用 numpy里面全部的内置方法 (build-in methods) 了,好比求和与均值。php
numpy.sum()numpy.mean()
可是每次写 numpy字数有点多,一般咱们给 numpy 起个别名 np,用如下语法,这样全部出现 numpy的地方均可以用 np 替代。css
import numpy as np
为何要专门学习数组呢?看下面「numpy数组」和「列表」之间的计算效率对比:两个大小都是 1000000,把每一个元素翻倍,运行 10 次用 %time 记时。html
my_arr = np.arange(1000000)my_list = list(range(1000000))
%time for _ in range(10): my_arr2 = my_arr * 2
Wall time: 48.9 ms
%time for _ in range(10): my_list2 = [x * 2 for x in my_list]
Wall time: 1.33 s
咱们发现「numpy数组」效率是「列表」效率的 27 (1.33*1000/48.9) 倍左右。若是元素全是数值型变量 (numerical variable),那么 numpy数组明显是个很好的数据结构。java
学习 numpy仍是遵循的 Python 里「万物皆对象」的原则,既然把数组当对象,咱们就按着数组的建立、数组的存载、数组的获取、数组的变形、和数组的计算来盘一盘 NumPy,目录以下:web
有些读者可能会说,NumPy 都什么好学的,数组都弄不懂的人还能干什么,那我来问你个问题,知道「转置操做」吧,那么下面这个二维数组转置后是什么?算法
arr = np.array([[1,2,3],[4,5,6]])arr
array([[1, 2, 3], [4, 5, 6]])
太简单了,是 [[1,4], [2,5], [3,6]],来看看是否是。shell
arr.T
array([[1, 4], [2, 5], [3, 6]])
答对了,你牛,再看一道转置的题
apache
arr = np.arange(16).reshape((2, 2, 4))arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
等等,如今有三维,转置一般不是转两个维度吗?转三个维度也能够?固然,好比把第 1, 2, 3 维度转置到第 2, 1, 3 维度,能够用 transpose 函数。swift
arr.transpose(1,0,2)
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
若是不知道上面答案怎么来的,我以为你仍是有必要看看本帖的。因为篇幅缘由,NumPy 系列也分两贴,上贴讲前三节的内容,下帖讲后两节的内容。
1
数组的建立
1.1
初次印象
数组 (array) 是相同类型的元素 (element) 的集合所组成数据结构 (data structure)。numpy 数组中的元素用的最可能是「数值型」元素,平时咱们说的一维、二维、三维数组长下面这个样子 (对应着线、面、体)。四维数组很难被可视化。
注意一个关键字 axis,中文叫「轴」,一个数组是多少维度就有多少根轴。因为 Python 计数都是从 0 开始的,那么
第 1 维度 = axis 0
第 2 维度 = axis 1
第 3 维度 = axis 2
但这些数组只可能在平面上打印出来,那么它们 (高于二维的数组) 的表现形式稍微有些不一样。
分析上图各个数组的在不一样维度上的元素:
一维数组:轴 0 有 3 个元素
二维数组:轴 0 有 2 个元素,轴 1 有 3 个元素
三维数组:轴 0 有 2 个元素 (2 块),轴 1 有 2 个元素,轴 2 有 3 个元素
四维数组:轴 0 有 2 个元素 (2 块),轴 1 有 2 个元素 (2 块),轴 2 有 2 个元素,轴 3 有 3 个元素
2.1
建立数组
带着上面这个对轴的认识,接下来咱们用代码来建立 numpy数组,有三种方式:
按步就班的 np.array() 用在列表和元组上
定隔定点的 np.arange() 和 np.linspace()
一步登天的 np.ones(), np.zeros(), np.eye() 和 np.random.random()
按步就班法
给了「列表」和「元组」原材料,用 np.array() 包装一下便获得 numpy数组。
l = [3.5, 5, 2, 8, 4.2]np.array(l)
array([3.5, 5. , 2. , 8. , 4.2])
t = (3.5, 5, 2, 8, 4.2)np.array(t)
array([3.5, 5. , 2. , 8. , 4.2])
注意,numpy数组的输出都带有 array() 的字样,里面的元素用「中括号 []」框住。
定隔定点法
更常见的两种建立 numpy数组方法:
定隔的 arange:固定元素大小间隔
定点的 linspace:固定元素个数
先看 arange例子:
print( np.arange(8) )print( np.arange(2,8) )print( np.arange(2,8,2))
[0 1 2 3 4 5 6 7]
[2 3 4 5 6 7]
[2 4 6]