入门numpy(上)【解读numpy官方文档】

浏览: 5912

前言

之前连载了pandas,pandas作为python做数据分析的一大利器,相信大家都不陌生。

当然连载部分作为入门是够了,具体提升还要大家多看看官方文档详细内容和做具体项目案例

之后我也会出一些pandas的数据分析实战案例分享给大家。

在询问了大家的意见和建议(怎么说的这么官方,不是我的风格啊)之后

我决定解读一下numpy的官方文档(入门部分)

让大家能够快速上手numpy


首先,我们看看官方是怎么介绍numpy的:

'''

NumPy是使用Python进行科学计算的基础软件包。 它包含以下内容:

(1)一个强大的N维数组对象

(2)复杂(广播)功能

(3)用于集成C / C ++和Fortran代码的工具

(4)非常有用的线性代数,傅里叶变换和随机数操作

(5)除了其明显的科学用途,NumPy也可以用作通用数据的高效多维容器。 可以定义任意数据类型。 这使NumPy能够无缝地,快速地与各种数据库集成。

'''


可能大家对"广播"一词不太了解,广播的意思可以这样理解,当我有两个维度不一样的array(数组)运算时,我可以用低维的数组复制成高维数组参与运算(因为运算要符合一定结构)

numpy官方网站:http://www.numpy.org/

开始numpy之旅

如果你是一个python初学者,我不建议你直接去python官网下载python3.X或是python2.7版本

我推荐你直接去anaconda官网下载对应版本的anaconda(建议下载最新的3.X版本)

下载地址:

https://www.continuum.io/downloads

如果你是windows用户,直接进入官网下载下图的即可

Clipboard Image.png


为什么推荐anaconda呢?

因为anaconda是python的集成环境,自带了很多python的库(或者认为是包)

举个栗子:

如果Python是一个光杆司令的话,anaconda则是一个司令带着一堆军队

so,你应该知道为什么我推荐你装anaconda了吧

如果你已经装了原生python并且用了挺久,也pip install 了很多库,类似numpy,scipy,pandas

那么你一定遇到很多报错,恭喜你,你已经才过了很多坑啦~就像我一样

有趣的是:

python是巨蟒的意思

anaconda是水蟒的意思

如果你在pip install numpy中由于网速慢安装报错,你可以来这里下载然后本地安装numpy

https://pypi.python.org/pypi/numpy#downloads

numpy快速入门官方文档:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

环境

python3.X


一颗栗子

import numpy as np

如果没报错,恭喜你,numpy安装完成

这里是把numpy命名为np

可以说是行业潜规则,当然是为了之后写代码简写方便


a = np.arange(15).reshape(3, 5)
a

Clipboard Image.png

注:这里的array(数组)是numpy中特有的类型,首先,使用np.arange(15)产生了一个一维数组,从0-14(注意范围)

arange不是arrange,arange是numpy的方法,所以写为np.arange()

然后,使用reshape()方法将这个产生的数组重新造型为3行5列的二维数组,也就有了上图的样子。


a.shape

Clipboard Image.png

注:查看数组格式,显示三行五列


a.ndim

Clipboard Image.png

注:显示数组的维数

如果你想知道这个方法的含义,可以在jupyter notebook (装完anaconda自带的ide编辑器)里输入:

?np.dim

Clipboard Image.pngClipboard Image.png

还有举例子帮你理解呢~


a.dtype.name

Clipboard Image.png

注:a数组中的数值类型


a.itemsize

Clipboard Image.png

注:每个数组元素的字节大小


a.size

Clipboard Image.png

注:a数组中的元素个数


type(a)

Clipboard Image.png

注:a的类型


b = np.array([6, 7, 8])
b

Clipboard Image.png

注:当然,你可以直接通过直接赋值创建一个数组


type(b)

Clipboard Image.png


创建数组

使用array方法直接通过list(列表)创建数组

import numpy as np
a = np.array([2,3,4])
a

Clipboard Image.png


a.dtype

Clipboard Image.png


b = np.array([1.2, 3.5, 5.1])
b.dtype

Clipboard Image.png

注:可以创建整形和浮点型元素的数组

常见错误:没有经过list直接用数列创建数组

Clipboard Image.png


b = np.array([(1.5,2,3), (4,5,6)])
b

Clipboard Image.png

注:创建二维数组


当然,创建数组的时候,也可以指明类型:

c = np.array( [ [1,2], [3,4] ], dtype=complex )
c

Clipboard Image.png

注:这里指定的是复数类型


 np.zeros( (3,4) )

Clipboard Image.png

注:创建全零数组,默认为float64形式


np.ones( (2,3,4), dtype=np.int16 )

Clipboard Image.png

注:创建一个三维全1的数组,并且创建时指定类型

你可以认为是一个长方体里有序的充满了1

观察括号,有层次的


np.empty( (2,3) )

Clipboard Image.png

注:创建一个二维的空数组,电脑不同导致显示不同


使用arange创建array

np.arange( 10, 30, 5 )

Clipboard Image.png

注:产生一个起始值为10,终止值为30(注意,终止值取不到),步长为5的数组

有点像c语言中的for循环格式


np.arange( 0, 2, 0.3 )

Clipboard Image.png

注:这里想说它接受float的值,不仅仅是int类型的值


当使用浮点参数时,由于有限的浮点精度,通常不可能预测获得的元素的数量。

 因此,通常最好使用函数linspace来接收我们想要的元素的数量作为参数,而不是使用步长参数:

from numpy import pi
np.linspace( 0, 2, 9 )

Clipboard Image.png

注:产生0到2之间等间距(步长)的9个元素的数组,linspace和matlab中的用法一样


x = np.linspace( 0, 2*pi, 100 )
f = np.sin(x)
f

注:在之前import了pi(π),现在相当于在0~2pi之间产生100个均匀的数字作为x

然后通过sin(x)算出对应的y,部分结果如下:

Clipboard Image.png

更详细的操作可以在这里看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

就是下图这里,链接太多,就不一个个弄出来了

Clipboard Image.png


显示数组

a = np.arange(6)
print(a)

Clipboard Image.png

注:打印一维数组


b = np.arange(12).reshape(4,3)
print(b)

Clipboard Image.png

注:打印二维数组


c = np.arange(24).reshape(2,3,4)
print(c)

Clipboard Image.png

注:打印三维数组

更多reshape方法可以看这里:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html#quickstart-shape-manipulation


如果数组太大而无法全部打印,NumPy会自动跳过中央部分,只能打印出边界部分(首尾):

print(np.arange(10000))

Clipboard Image.png


print(np.arange(10000).reshape(100,100))

Clipboard Image.png


要禁用此省略并强制NumPy打印整个数组,您可以使用set_printoptions更改打印选项。

np.set_printoptions(threshold='nan')

基本操作

a = np.array( [20,30,40,50] )
b = np.arange( 4 )
b

Clipboard Image.png

c = a-b
c

Clipboard Image.png

注:数组相减


b**2

Clipboard Image.png

注:b数组中每个元素平方


10*np.sin(a)

Clipboard Image.png

注:a数组先进行sin运算,然后结果乘10


a<35

Clipboard Image.png

注:对a数组中每个元素和35进行比较大小,返回的是一个充满布尔元素的数组


数组的矩阵乘法和对应元素乘积方法:

原理参考线性代数

A = np.array( [[1,1],
[0,1]] )
B = np.array( [[2,0],
[3,4]] )

注:创建两个数组(矩阵)


A*B

Clipboard Image.png

注:对应元素相乘


A.dot(B)

Clipboard Image.png

注:A左乘B,也可以写成如下形式:

np.dot(A, B) 

结果一样的


A左乘B  和  B左乘A是不一样的,详见线性代数课本


某些操作(例如+ =和* =)将作用于修改现有数组而不是创建新的数组:

a = np.ones((2,3), dtype=int)
b = np.random.random((2,3))
a *= 3
a

Clipboard Image.png

注:创建一个2行3列全是元素1的数组a,然后将a的元素都乘3

小插曲:

(1)

num = 1
num = num + 1
num

(2)

num = 1
num += 1
num

初学者可以认为以上两种一样的意思,其实不一样,等你自己慢慢去挖掘。

同理以下也是:

num -= 1
num *= 1
num /= 1

回到正题:

b += a
b

相当于b = b+a

Clipboard Image.png

注:这里要说的是以上操作是修改现有数组而不是创建新的数组!!!

所以有时候尽量先备份一个

易错点:

Clipboard Image.png

这里a是int类型,b是float类型:

Clipboard Image.png

运算时,一般是可以默认自动从int到float转换(从简单到复杂)

而你的a = a+b相当于将float转为int,所以报错了


未完待续~近期更新~谢谢观赏~希望对你学习有帮助~

推荐 6
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

很棒
个人感觉和画图计算还是R好。。。

要回复文章请先登录注册