浏览量: 55 次浏览

numpy库的使用教程

2020年2月25日 0 作者 Nie Hen

简单使用numpy

import numpy as np #为了方便使用numpy 采用np简写
array = np.array([[1,2,3],[2,3,4]])  #列表转化为矩阵
print(array)
"""
array([[1, 2, 3],
       [2, 3, 4]])
"""
print('number of dim:',array.ndim)  # 维度
#number of dim: 2  

print('shape :',array.shape)    # 行数和列数
#shape : (2, 3)

print('size:',array.size)   # 元素个数
#size: 6

采用np.array()创建时需要几个维度就要用几个[ ]括起来,这种创建方式要给定数据;采用np.ones()或np.zeros()创建分别产生全1或全0的数据,用a.shape会输出你创建时的输入,创建时输入了几个维度输出就会用几个[ ]括起来,shape的返回值是一个元组,里面每个数字表示每一维的长度

创建array

a = np.array([2,23,4],dtype=np.int) #定义数组的数据类型默认是64位
print(a.dtype)
#int 64
a = np.zeros((3,4)) # 数据全为0,3行4列
“””
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])

np.ones()创建默认值位1的数组
np.empty()创建为空实际是接近与0的值 括号里面要输入创建数组的shape
np.arange() 创建连续数组 np.arange(10) 会生成一个一维的从0到9的数组
reshape() 可以改变数组的形状 np.arange(12).reshape((3,4)) 会生成一个三行四列的从0到11的数组
np.linspace()创建线段型数据 np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段

numpy的运算

a 和 b 是两个属性为 array 也就是矩阵的变量如果想要求a和b两个矩阵之间的加减乘除次方等 直接使用 + – × / ** 对a b进行运算即可。
对每矩阵中的每一项都进行函数运算时,比如三角函数,可以使用np.sin(a)
进行逻辑判断 如print(b<3)返回的是一个bool类型的矩阵,即对满足要求的返回True,不满足的返回False。
Numpy中的矩阵乘法分为两种, 其一是前文中的对应元素相乘,其二是标准的矩阵乘法运算,即对应行乘对应列得到相应元素:np.dot(a,b) 或者是a.dot(b)
如果你需要对行或者列进行查找运算,就需要在上述代码中为 axis 进行赋值。 当axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。print(“sum =”,np.sum(a,axis=1))
#sum = [ 1.96877324 2.43558896] a是两行 所以有两个返回值。

平均值算法 np.average(a) np.mean(a) 或是 a.mean()
求中位数 np.median(a) np.median(a,axis=0)对列进行计算 np.median(a,axis=1) 对于行进行计算
求累加 当前值为前面值的和 np.cumsum(a)

求差值 当前值为 后一位值减去之前当前位置的值 np.diff(a)

对矩阵中的值进行排列 np.sort(a) 会逐行进行排序
矩阵的反向 行变成列 列变成行 np.transpose(a) 或是 a.T
np.clip(a,5,9) 在a中小于5的数变成5大于9的数变成9

Numpy 索引

a=np.arange(3,15) print(a[3]) 会输出6 类似与列表的操作方式
当数组为二维时 b=np.arange(3,15).reshape([3,4]) b[2]是第三行的所有元素b.[1,1:3] 是第二列的第二个值到第三个值
b[1][1] 是第二行第二列的值
逐行打印 for row in b: 逐列打印 (反转一下)for column in b.T:
逐个打印
for item in a.flat:
print(item)
for item in a.flatten():
print(item)
flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列。而flat是一个迭代器,本身是一个object属性。

Numpy array 合并

使用 np.vstack((a,b)) 上下进行合并 对整体进行操作 上下行元素数量要相等 不然合成的列数不相同会出错

import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])

print(np.vstack((A,B)))    # vertical stack
"""
[[1,1,1]
 [2,2,2]]
"""
使用 np.hstack((

a,b)) 对矩阵 a,b 进行左右合并
对于行列的操作 也可以使用 np.concatenate((a,b),axis=0) 当axis为0时进行列操作当axis为1时进行 行操作

Numpy array 分割

纵向分割 np.split(a,2,axis=1) 其中a=np.arange(12).reshape((3,4))
以一维为轴分割 00 01 02 03 分为两部分 10 11 12 13分为两部分…. 相当于以列来分割

A = np.arange(12).reshape((3, 4))
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]
"""

横向分割 np.split(a,3,axis=0)
以0维为轴分割, 00 10 20 分为三部分 01 11 21 分为三部分….

print(np.split(A, 3, axis=0))

#[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]

对于分割只能等量分割 比如上面的array为三行四列 如果axis=1是分为3部分 就会出错。
不等量分割

np.array_split()
print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
        [4, 5],
        [8, 9]]), array([[ 2],
        [ 6],
        [10]]), array([[ 3],
        [ 7],
        [11]])]
"""

axis讲解

在numpy库中,axis轴的问题比较重要,不同的值会得到不同的结果,
可以总结为一句话:设axis=i,则numpy沿着第i个下标变化的方向进行操作
例如一个二维数组:data =[[a00, a01],[a10,a11]],所以axis=0时,沿着第0个下标变化的方向进行操作,也就是a00->a10, a01->a11,也就是纵坐标的方向,axis=1时也类似
使用一个四维的数组求sum

d=np.arange(48).reshape((2,3,2,4))
>>> print(d)
[[[[ 0  1  2  3]
   [ 4  5  6  7]]

  [[ 8  9 10 11]
   [12 13 14 15]]

  [[16 17 18 19]
   [20 21 22 23]]]


 [[[24 25 26 27]
   [28 29 30 31]]

  [[32 33 34 35]
   [36 37 38 39]]

  [[40 41 42 43]
   [44 45 46 47]]]]
>>> d.sum(axis=0)
array([[[24, 26, 28, 30],
        [32, 34, 36, 38]],

       [[40, 42, 44, 46],
        [48, 50, 52, 54]],

       [[56, 58, 60, 62],
        [64, 66, 68, 70]]])

以0维计算和 第一个元素值0000+1000 第二个0001+1001 第三个0002+1002 第四个0003+1003 第五个 0010+1010 第六个0011+1011、、、第一位数再循环的变

>>> d.sum(axis=3)
array([[[  6,  22],
        [ 38,  54],
        [ 70,  86]],

       [[102, 118],
        [134, 150],
        [166, 182]]])

以三维计算和 第一个元素值 0000+0001+0002+0003第二个元素值 0010+0011+0012+0013 第三个元素值 0100+0101+0102+0103 第四个元素值 0110+0111+0112+0113 ….

>>> d.shape
(2, 3, 2, 4)
>>> print(d.sum(axis=3).shape)
(2, 3, 2)

Numpy copy & deep copy

= 的赋值方式会带有关联性
a=np.arange((4))
b = a
c = a
a[0]=11
#此时 b[0]=11 同时更改c b和a也会变 相当于b和c获取到了a的地址
copy() 的赋值方式没有关联性
b=a.copy()
a[3]=44

此时b[3]=33 并没有因为a的改变而改变 b和a已经没有了关联

数据可视化 使用plot()

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#随机生成1000个数据
data = pd.Series(np.random.randn(1000),index=np.arange(1000))

#为了方便观看效果, 我们累加这个数据
data.cumsum()

#pandas 数据可以直接观看其可视化形式
data.plot()

plt.show()

data本来就是一个数据,所以我们可以直接plot
plot可以指定很多的参数 http://pandas.pydata.org/pandas-docs/version/0.18.1/visualization.html 具体用法
除了plot,我经常会用到还有scatter,这个会显示散点图,首先给大家说一下在 pandas 中有多少种方法

bar hist box kde area scatter hexbin

scatter只有x,y两个属性

last

Python存放的时候是不连续的区域,使得Python在索引这个容器里的数据时不是那么的有效率
在运用Numpy时通常不是用一个一维Array来存放数据,而是用 二维或者三维的块来存放。
实际上 不管是1D/2D/3D 的 Array, 从根本上, 它都是一个 1D array!