查看原文
其他

入门numpy(25%-50%)【解读numpy官方文档】

2017-07-06 王大伟 Python爱好者社区

(点击上方Python爱好者社区,可快速关注)

作者:王大伟

博客专栏:https://www.hellobi.com/u/wangdawei/articles

Python爱好者社区  唯一小编 

前言

最近在学习入门python可视化,先后初步探索了seaborn、matplotlib、plotly和ggplot

发现还是pandas的绘图最容易上手,样式也很商务化,学完官方文档之后和大家一起分享

言归正传,今天继续连载numpy入门系列

前文传送门:https://ask.hellobi.com/blog/wangdawei/8708

基本操作

当使用不同类型的数组时,结果得到的数组的类型对应于更一般或精确的数组(称为upcasting的行为)。

import numpy as np
from numpy import pi

注:从numpy中导入pi(π)


a = np.ones(3, dtype=np.int32)
a


注:创建一个一行三列的矩阵(元素都是1)


b = np.linspace(0,pi,3)
b.dtype.name


注:在0-π之间均匀产生三个等间隔的数字,b的类型是浮点型


c = a+b
c


c.dtype.name


注:得到的c的类型为浮点型


d = np.exp(c*1j)
d


d.dtype.name


注:得到的是复数


许多一元操作,例如计算数组中所有元素的总和,都被实现为ndarray类的方法

a = np.random.random((2,3))
a


注:产生2行3列的随机数组(元素值为0-1之间的随机数)


a.sum()


注:将a数组所有元素求和


a.min()


注:返回a数组中最小的元素值


a.max()


注:返回a数组中的最大值

注意:我们看到的数组和单独取出的最大值保留的小数位数不同


默认情况下,这些操作适用于数组,就像它是数字列表一样,不管其形状如何。 但是,通过指定轴参数,您可以沿着数组的指定轴应用一个操作:

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


注:通过reshape将产生的1行的数组转变为3行4列


b.sum(axis=0)


注:将每一列求和,因为指定了参数axis = 0 


b.sum(axis=1)


注:按行求和


b.sum()


注:不加axis参数则是所有元素求和


b.min(axis=1)


注:求每行的最小值


b.cumsum(axis=1)


注:要学会自己查帮助文件

?b.cumsum(axis=1)


是返回沿给定轴的元素的累加和

这是什么意思呢?画个图很好理解:


就是把前面所有的加上自己当前的值得到的结果放在当前位置,就是数列前n项累加和的意思

注意这里是按行累加


通用功能

NumPy提供熟悉的数学函数,如sin,cos和exp。 在NumPy中,这些被称为“通用函数”(ufunc)。 在NumPy中,这些函数在数组上以元素方式运算,产生一个数组作为输出。

B = np.arange(3)
B


注:创建一个数组


np.exp(B)


注:对每个元素求e的某次方


np.sqrt(B)


注:对每个元素开方


C = np.array([2., -1., 4.])
np.add(B, C)


注:将两个数组相加(要求数组形状相同)

如果形状不同,则会报错如下:


查看这部分更多更详细的用法可以看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

下图部分:



索引,切片和迭代

一维数组可以被索引,切片和迭代,非常像列表和其他Python序列。

a = np.arange(10)**3
a


注:对数组中每个元素求3次方


a[2]


注:取出序列为2的元素


a[2:5]


注:切片操作


a[:6:2] = -1000    
a


注: 和 a[0:6:2] = -1000相同; 从最初到序列号6(6取不到),步长为2,将-1000赋值相应的元素。


a[ : :-1]


注:数组元素逆序排列


for i in a:
    print(i**(1/3.))


注:对a数组中每个元素,求1/3次方

结果是nan的我有些不解,-10的3次方不是-1000么

于是我试了试:


希望有了解的大神留言评论指导一下,这个nan暂时跳过吧


多维数组每条轴可以有一个索引。 这些索引以逗号分隔的元组给出:

def f(x,y):
   return 10*x+y

注:定义一个函数,参数有两个:x,y

b = np.fromfunction(f,(5,4),dtype=int)
b


注:我们看一下帮助:

?np.fromfunction

指的是,建立5行4列的数组,然后对每个位置元素(i,j)索引代表位置,例如(2,3)位置时,

计算函数值10*2+3=13,所以返回13,其他同理。


b[2,3]


注:我们可以取出数组中的元素值,注意行和列索引是用逗号分隔,而不是冒号(冒号是切片)


b[0:5, 1]


注:按照下标索引切片


b[ : ,1]


注:按照下标索引切片


b[1:3, : ]


注:按照下标索引切片


b[-1]


注:这个相当于b[-1,:]


一些省略记法:

例如五维的数组:

  • x[1,2,...]与 x[1,2,:,:,:]等价

  • x[...,3] 与 x[:,:,:,:,3] 等价

  • x[4,...,5,:] 与 x[4,:,:,5,:]等价

c = np.array( [[[  0,  1,  2],
               [ 10, 12, 13]],
             [[100,101,102],
               [110,112,113]]])
c.shape


注:这是一个三维数组,并显示行、列、高的信息


c[1,...]


注:等同于c[1,:,:] 或c[1],有点像切蛋糕的感觉,切出一片二维的。


c[...,2]


注:等同于c[:,:,2]、


相对于第一轴完成多维数组迭代:

for row in b:
    print(row)


注:有点像三位数组降维成多个一维的感觉


但是,如果要对数组中的每个元素执行操作,可以使用flat属性,该属性是数组的所有元素的迭代器:

for element in b.flat:
    print(element)


注:这是取出多维数组中所有元素的一个不错方法


查看这部分更多更详细的用法可以看:https://docs.scipy.org/doc/numpy-dev/user/quickstart.html

下图部分:


对形状操作

改变数组的形状

a = np.floor(10*np.random.random((3,4)))
a


注:通过?np.floor()

我们只到,该方法是向下取整的意思

例如:

num = np.array([-1.7, -1.5, -0.2, 0.2, 1.5, 1.7, 2.0])
np.floor(num)


向下取整就是指一个数字往减小的方向取到最近的值,例如上面例子的-1.7变成-2.0

所以这是产生随机整数的方法,但这里的数字是float不是int类型


可以通过各种命令改变阵列的形状。 请注意,以下三个命令都返回一个修改的新数组,不更改原始数组:

a.ravel()


注:将数组改成一维


a.reshape(6,2)


注:将数组转化为指定形状


a.T


注:数组转置,和矩阵转置一样理解


a.T.shape


矩阵转置之后的形状


a.shape


注:原来矩阵的形状

至此,numpy入门完成了一半,还有两篇完结,之后咱写可视化吧,哈哈~

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

关注公众号,“Python爱好者社区”,回复“爬虫”即可获取崔老师爬虫免费学习视频。


Python爱好者社区


为大家提供与Python相关的最新技术和资讯。

长按指纹 > 识别图中二维码 > 添加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存