numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于在大型、多维数组上执行数值运算。
创建数组:
import numpy as np
a = np.array([1,2,3,4,5])
b = np.array(range(1,6))
c = np.arange(1,6)
print(a,b,c)
[1 2 3 4 5] [1 2 3 4 5] [1 2 3 4 5]
上面a,b,c内容相同,注意arange和range的区别
np.arange的用法:arange([start,] stop[, step,],dtype=None)
数组的类名
import numpy as np
a = np.array([1,2,3,4,5])
type(a)
numpy.ndarray
数据的类型
print(a.dtype)
int32
数据类型的操作
指定创建数组的数据类型:
a = np.array([1,0,1,0],dtype=np.bool)
print(a)
[ True False True False]
修改数组的数据类型:
print(a.astype("i1"))
print(a.astype(np.int8))
修改浮点型的小数位数:
b = p.array([0.0485436,0.26320629,0.69646413,0.71811003])
print(np.round(b,2))
数组的形状
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
print(a)
#查看数组的形状:
print(a.shape)
#修改数组的形状:
print(a.reshape(3,4))
把数组转化为1维度数据
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
print(a)
#查看数组的形状:
print(a.shape)
#修改数组的形状:
print(a.reshape(3,4))
print("*"*100)
b = a.reshape(3,4)
print(b)
print(b.reshape(1,12))
print(b.flatten())
数组和数的计算
加法减法
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
#加法减法
print(a+1)
[[ 4 5 6 7 8 9]
[ 5 6 7 8 9 10]]
乘法除法
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
#乘法除法
print(a*3)
[[ 9 12 15 18 21 24]
[12 15 18 21 24 27]]
Numpy的广播机制,在运算过程中,加减乘除的值被广播到所有的元素上面。
数组和数组的计算
数组和数组的加减法
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
b = np.array([[21,22,23,24,25,26],[27,28,29,30,31,32]])
#数组和数组的加减法
print(a+b)
[[24 26 28 30 32 34]
[31 33 35 37 39 41]]
数组和数组的乘除法
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
b = np.array([[21,22,23,24,25,26],[27,28,29,30,31,32]])
#数组和数组的乘法
print(a*b)
[[ 63 88 115 144 175 208]
[108 140 174 210 248 288]]
不同维度数组计算
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
b = np.array([[21,22,23,24,25,26],[27,28,29,30,31,32]])
c = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
#不同维度的数组计算
print(a*c)
ValueError: operands could not be broadcast together with shapes (2,6) (3,4)
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
b = np.array([[21,22,23,24,25,26],[27,28,29,30,31,32]])
c = np.array([[1,2,3,4,5,6]])
#不同维度的数组计算
print(a*c)
print(a-c)
[[ 3 8 15 24 35 48]
[ 4 10 18 28 40 54]]
[[2 2 2 2 2 2]
[3 3 3 3 3 3]]
import numpy as np
a = np.array([[3,4,5,6,7,8],[4,5,6,7,8,9]])
c = np.array([[1],[2]])
#不同维度的数组计算
print(c+a)
print(c*a)
print(a*c)
[[ 4 5 6 7 8 9]
[ 6 7 8 9 10 11]]
[[ 3 4 5 6 7 8]
[ 8 10 12 14 16 18]]
[[ 3 4 5 6 7 8]
[ 8 10 12 14 16 18]]
广播原则
如果两个数组的后缘维度(trailing dimension,即从末尾开始算起的维度)的轴长度相符或其中一方的长度为1,则认为它们是广播兼容的。广播会在缺失和(或)长度为1的维度上进行。
Numpy读取数据
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
CSV: Comma-Separated Value,逗号分隔值文件
np.loadtxt(US_video_data_numbers_path,delimiter=",",dtype=int,unpack=1)
注意其中添加delimiter和dtype以及unpack的效果
delimiter:指定边界符号是什么,不指定会导致每行数据为一个整体的字符串而报错
dtype:默认情况下对于较大的数据会将其变为科学计数的方式
unpack:默认是False(0),默认情况下,有多少条数据,就会有多少行。为True(1)的情况下,每一列的数据会组成一行,原始数据有多少列,加载出来的数据就会有多少行,相当于转置的效果。
转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据。
import numpy as np
t = np.array([[0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,14,15,16,17]])
print(t.transpose())
print(t.swapaxes(1,0))
print(t.T)
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
[[ 0 6 12]
[ 1 7 13]
[ 2 8 14]
[ 3 9 15]
[ 4 10 16]
[ 5 11 17]]
以上的三种方法都可以实现二维数组的转置的效果。
numpy索引和切片
取行一般冒号在后面或者后面冒号省略;取列一般冒号在前或者前面冒号省略。
import numpy as np
a = np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
#取一行
print(a[1])
#取一列
print(a[:,2])
#取多行
print(a[1:3])
#取多列
print(a[:,2:4])
#取特定的行
print(a[[1,3],:])
#取特定的列
print(a[:,[2,4]])
numpy中数值的修改
import numpy as np
t = np.array([[0,1,2,3,4,5],[6,7,8,9,10,11],[12,13,14,15,16,17],[18,19,20,21,22,23]])
t[:,2:4] = 0
print(t)
[[ 0 1 0 0 4 5]
[ 6 7 0 0 10 11]
[12 13 0 0 16 17]
[18 19 0 0 22 23]]
把t中小于10的数字替换为0
import numpy as np
t = np.arange(24).reshape((4,6))
t[t<10] = 0
print(t)
numpy中三元运算符
把t中小于10的数字替换为0,把大于10的替换为10
import numpy as np
t = np.arange(24).reshape((4,6))
x = np.where(t<10,0,10) #numpy的三元运算符
print(x)
把t中小于10的数字替换为0,把大于20的替换为20:
import numpy as np
t = np.arange(24).reshape((4,6))
x = t.clip(10,20)
print(x)
nan表示not a number表示不是一个数字
什么时候numpy中会出现nan:当我们读取本地的文件为float的时候,如果有缺失,就会出现nan当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)。
inf表示正无穷大,-inf表示负无穷大。