安装模块
pip install numpy
简单实例:
# 导入模块
import numpy as np
# 创建一个数组,也就是列表
a = np.arange(10)
print(a)
print(a.shape)
输出:
[0 1 2 3 4 5 6 7 8 9]
(10,)
# numpy中的arange函数和range这个函数相似,都是生成一个列表。
# shape:当是一维数组的时候,就会输出一共有多少个值
# 创建一个二维数组
a2 = np.array([[1,2,3],[4,5,6]])
print(a2)
print(a2.shape)
输出:
[[1 2 3]
[4 5 6]]
(2, 3)
# 当我们用array函数创建一个不是一维数组的时候,shape就会输出一个元组,2表示行数,3表示列数。
# 当我们创建成np.array([[1,2,3],[4,5]]),就会只输出一个行数。
# 当我们创建一个三位数组的时候,shape中就会有三个值。
# 当是三维数组的时候第一个值表示分为几块,第二个,第三个值就是行数和列数。
改变数组形状
实例:
# 导入模块
import numpy as np
# 创建一个数组并且把a变成一个2行5列的数组
a = np.arange(10)
a2 = a.reshape((2,5))
print(a2)
输出:
[[0 1 2 3 4]
[5 6 7 8 9]]
# 值得注意的是,reshape的参数是一个元组,并且参数的乘积是我们的数组个数。
# 如果想变成一维的:a3 = a2.reshape((10,))
# 如果不知道里面有多少数字使用 a2.shape[0]*a2.shape[1]或者a2.flatten()即可。
numpy的计算
实例:
import numpy as np
# 创建一个2行5列的数组
b = np.arange(10).reshape((2,5))
b2 = b/0
print(b2)
输出:
[[nan inf inf inf inf]
[inf inf inf inf inf]]
# 此时会报错,他会将我们b中的每一个数都除以0。如果写成b2 = b+5,他就会将我们b中的每一个数加5。
# nan是0/0的结果,inf是一个数字/0的结果。
# 数组和数组之间也是可以进行运算的,形状相同的数组是对应的位置进行计算。不同形状就会报错,
# 但是当我们行是对应的时候,就会按照行计算,当我们的列对应就会按照列计算。
比如我们的b还是这样
b = np.arange(10).reshape((2,5))
c = np.arange(5)
此时是可以进行计算的,b的每一行都会和c中对应的数值进行计算。
再比如:
b = np.arange(10).reshape((2,5))
c = np.array([[1],[2]])
此时也是可以计算的。
查看数组中存放的类型:
比如:
a = np.arange(10)
print(a.dtype)
输出:
int32或或者int64。
还有其他类型:
我们在创建数组的时候是可以指定类型的:
e = np.array([1,2,3,4],dtype='float32')
print(e.dtype) # 就会输出 float32
轴(axis)的概念
一维数组只有一个0轴,二维数组有0轴和1轴,三维数组有0轴和1轴和2轴。
可以把他想象成数学中的x,y,z轴,当我们返回的shape是(2, 3)这里的2就是0轴,3就是1轴。
读取本地数据
我们读取本地数据不常用numpy,但是numpy中对于读取本地数据是有对应的方法的。
读取本地数据是从csv文件中读取,用方法loadtxt来读取。
np.loadtxt()中的参数:
frname:文件名,可以加上路径,和open函数一样
dtype:数据类型
delimiter:分割的字符串,默认为空格,可以修改为其他
skiprows:跳过前几行
usecols:读取指定的列,为元组类型
unpack:如果为True,行变成列,列变成行,意思就是反转,默认为False
实例:
首先我们创建一个csv文件,我们首先在当前文件夹下创建一个文本txt,然后在里面写上:
1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
再将后缀名修改成csv,我们再写上这样的代码:
import numpy as np
txt1 = np.loadtxt('./test.csv',delimiter=',',dtype='int')
txt2 = np.loadtxt('./test.csv',delimiter=',',dtype='int',unpack=True)
print(txt1)
print('...............')
print(txt2)
输出结果:
[[ 1 2 3 4 5]
[ 6 7 8 9 10]
[11 12 13 14 15]]
...............
[[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]
[ 5 10 15]]
如果我们写爬虫将今年最受欢迎的电影的票房都爬取下来,就可以读取数据,再用matplotlib来一个可视化。
就会看到效果。
numpy中的切片和索引
在python基础中列表有切片和索引,在numpy中同样也有。
对于一维数组:
import numpy as np
a = np.arange(10)
s = slice(1,8,2) # 从索引 1 开始到索引 8 停止,间隔为2
print (a[s]) # [1 3 5 7]
同时也可以这样写:
import numpy as np
a = np.arange(10)
b = a[1:8:2] # 从索引 1 开始到索引 8 停止,间隔为 2
print(b) # [1 3 5 7]
也可以用索引来取值:
a = np.arange(10)
b = a[1]
c = a[1:]
d = a[1:5]
print(b) # 1
print(c) # [1 2 3 4 5 6 7 8 9]
print(d) # [1 2 3 4]
对于二维数组和三维数组等
创建以一个二维数组:
attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33],[44,55,66]])
a1 = attr[1]
a2 = attr[1:]
a3 = attr[1:3]
a4 = attr[[1,3,4]] # 取不连续的多行也就是2,4,5行
print(a1) # [4 5 6]
print(a2) # [[ 4 5 6] [ 7 8 9] [11 22 33] [44 55 66]]
print(a3) # [[4 5 6] [7 8 9]]
print(a4) # [[ 4 5 6] [11 22 33] [44 55 66]]
此时我们用索引就是取的一整个数组
取列值:
a5 = attr[:,0] # 取第一列的值
a6 = attr[:,1:] # 取连续的多列
a7 = attr[:,[0,2,3]] # 取不连续的列
a8 = attr[1,2] # 获取第2行第3列
a9 = attr[1:3,0:2] # 获取第2行到第3行 的第1列到第2列
a10 = attr[[1,2],[1,0]] # 获取第2行的第2列的值和第3行的第1个值
# 可以看成一个坐标1,1 和2,0,相当与x和y,只是从0开始
# 其实上面的取行就是省略的列的:同样我们a1的值也可以写成a1 = attr[1,:]
...的作用也可以取列值
attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33],[44,55,66]])
print(attr)
print("*"*20)
print(attr[...,1]) # 取第二列元素
print("*"*20)
print(attr[1,...]) # 取第二行元素
print("*"*20)
print(attr[...,1:]) # 取2列和后面的列的数据
# 此种操作常用于取列值
输出:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[11 22 33]
[44 55 66]]
********************
[ 2 5 8 22 55]
********************
[4 5 6]
********************
[[ 2 3]
[ 5 6]
[ 8 9]
[22 33]
[55 66]]
修改操作
很简单,重新赋值即可
比如:
attr[1,2] = 1111 # 就是把第2行的第3列修改成1111
attr[attr<5] = 5555 # 会修改所有小于5的值为5555
attr[attr>25] = 6666 # 会修改所有大于25的值为6666
在列表中有三元运算符,那么在numpy中也是有的
# 把大于10的修改为4444,小于10的修改为0
attr1 = np.where(attr>10,4444,0)
print(attr1)
# 如果你取得不是一个单独的值:就会全部修改
裁剪(clip)
比如:
attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33],[44,55,66]])
print(attr)
attr1 = attr.clip(9,22)
print("*"*20)
print(attr1)
输出:
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[11 22 33]
[44 55 66]]
********************
[[ 9 9 9]
[ 9 9 9]
[ 9 9 9]
[11 22 22]
[22 22 22]]
# clip就会把小于9的替换成9,把大于22的替换成22.假如存在nan值,是不会被替换的。