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

浏览: 3362

前言

最近在学习入门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

Clipboard Image.png

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


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

Clipboard Image.png

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


c = a+b
c

Clipboard Image.png

c.dtype.name

Clipboard Image.png

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


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

Clipboard Image.png

d.dtype.name

Clipboard Image.png

注:得到的是复数


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

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

Clipboard Image.png

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


a.sum()

Clipboard Image.png

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


a.min()

Clipboard Image.png

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


a.max()

Clipboard Image.png

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

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


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

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

Clipboard Image.png

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


b.sum(axis=0) 

Clipboard Image.png

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


b.sum(axis=1)

Clipboard Image.png

注:按行求和


b.sum()

Clipboard Image.png

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


b.min(axis=1)

Clipboard Image.png

注:求每行的最小值


b.cumsum(axis=1)

Clipboard Image.png

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

?b.cumsum(axis=1)

Clipboard Image.png

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

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

Clipboard Image.png

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

注意这里是按行累加


通用功能

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

B = np.arange(3)
B

Clipboard Image.png

注:创建一个数组


np.exp(B)

Clipboard Image.png

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


np.sqrt(B)

Clipboard Image.png

注:对每个元素开方


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

Clipboard Image.png

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

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

Clipboard Image.png

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

下图部分:

Clipboard Image.png


索引,切片和迭代

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

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

Clipboard Image.png

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


a[2]

Clipboard Image.png

注:取出序列为2的元素


a[2:5]

Clipboard Image.png

注:切片操作


a[:6:2] = -1000    
a

Clipboard Image.png

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


a[ : :-1]

Clipboard Image.png

注:数组元素逆序排列


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

Clipboard Image.png

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

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

于是我试了试:

Clipboard Image.png

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


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

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

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

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

Clipboard Image.png

注:我们看一下帮助:

?np.fromfunction

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

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


b[2,3]

Clipboard Image.png

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


b[0:5, 1]

Clipboard Image.png

注:按照下标索引切片


b[ : ,1]

Clipboard Image.png

注:按照下标索引切片


b[1:3, : ]

Clipboard Image.png

注:按照下标索引切片


b[-1]

Clipboard Image.png

注:这个相当于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

Clipboard Image.png

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


c[1,...]

Clipboard Image.png

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


c[...,2]

Clipboard Image.png

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


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

for row in b:
print(row)

Clipboard Image.png

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


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

for element in b.flat:
print(element)

Clipboard Image.png

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


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

下图部分:

Clipboard Image.png

对形状操作

改变数组的形状

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

Clipboard Image.png

注:通过?np.floor()

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

例如:

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

Clipboard Image.png

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

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


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

a.ravel()

Clipboard Image.png

注:将数组改成一维


a.reshape(6,2)

Clipboard Image.png

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


a.T

Clipboard Image.png

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


a.T.shape

Clipboard Image.png

矩阵转置之后的形状


a.shape

Clipboard Image.png

注:原来矩阵的形状

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

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

2 个评论

python会自动转换结果到复数,而numpy不会,所以返回nan

实际上,
print( (5+8.660254037844384j)**3 ) 约等于-1000
#(-999.9999999999993+3.410605131648481e-13j)
结果不是整-1000是因为-1/3四舍五入的原因,不是完整的三分之一

如果你想得到-1000正确的开立方结果-10:
print( np.cbrt(-1000) )
#-10.0

非大神,仅供参考。
厉害୧(๑•̀◡•́๑)૭

要回复文章请先登录注册