1.1numpy数组的的创建
import numpy as np
#1.np.random.random生成N行M列的数组,其中元素值为0-1的随机数
d=np.random.random((2,3))
d
array([[0.29540213, 0.58072479, 0.4035937 ],
[0.85043997, 0.57555037, 0.81086982]])
#2.使用np.array来创建数组
a = np.array([1,2,3,4])
a
array([1, 2, 3, 4])
#3.使用np.arange来创建数组
b = np.arange(0,10)
b = np.arange(0,10,2)#2为步长
b
array([0, 2, 4, 6, 8])
#4.使用np.random.randint来创建一个N行N列的数组,其中元素值的范围可以通过前面两个参数来定
c = np.random.randint(0,9,size=(4,4))
c
array([[4, 7, 8, 7],
[5, 7, 0, 8],
[5, 0, 0, 1],
[2, 5, 4, 2]])
#5.使用函数生成特殊的数组
a1 = np.zeros((2,2))
a2 = np.ones((3,2))
a3 = np.full((2,2),8)#生成一个所有元素都是8的2行2列的元素
a4 = np.eye(3)#生成一个主对角线为1,其他元素为0的3x3的矩阵
print("a1:",a1)
print("a2:",a2)
print("a3:",a3)
print("a4:",a4)
a1: [[0. 0.]
[0. 0.]]
a2: [[1. 1.]
[1. 1.]
[1. 1.]]
a3: [[8 8]
[8 8]]
a4: [[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
1.2数组的简单操作
import numpy as np
#ndim得到数组的维度
a1 = np.array([1,2,3])
print(a1.ndim)
a2 = np.array([[1,2,3],[4,5,6]])
print(a2.ndim)
1
2
#shape查看数组的形状(几行几列),shape是一个元组,里面有几个元素就代表是几维数组
print(a1.shape)
print(a2.shape)
(3,)
(2, 3)
#reshape修改数组的形状。条件是修改前后的数组的元素个数必须相同
a3 = a2.reshape((3,2))
print(a3)
print(a3.shape)
[[1 2]
[3 4]
[5 6]]
(3, 2)
a5 = a2.reshape((6,))
print(a5)
[1 2 3 4 5 6]
a6 = a2.flatten()#扁平化,将多维数组转换成一维数组
print(a6)
[1 2 3 4 5 6]
#ndarray.size查看数组有多少个元素
count = a3.size
print(count)
6
#ndarray.itemsize查看数组中每个元素所占内存大小,单位是字节
itemsize = a3.itemsize
print(itemsize)
print(a3.dtype)
print(itemsize*a3.size)
4
int32
24
1.3数组索引和切片&布尔索引&值的替换
import numpy as np
#1.一维数组的索引和切片
a1 = np.arange(10)
#1.1进行索引操作
print(a1[4])
#1.2进行切片操作
print(a1[4:6])
#1.3使用步长
print(a1[::2])
#使用负数来作为索引
print(a1[-2])
a1
4
[4 5]
[0 2 4 6 8]
8
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#2.多维数组的索引和切片
a2 = np.random.randint(0,10,size=(4,6))
print(a2)
print(a2[0])#获取第0行
print(a2[1:3])#获取第1行和第2行
print(a2[[0,2,3]])#获取第0行第2行第三行
[[3 0 6 4 0 2]
[7 8 3 0 3 7]
[5 5 3 2 5 4]
[1 2 2 9 2 7]]
[3 0 6 4 0 2]
[[7 8 3 0 3 7]
[5 5 3 2 5 4]]
[[3 0 6 4 0 2]
[5 5 3 2 5 4]
[1 2 2 9 2 7]]
print(a2[2,1])
print(a2[[1,2],[4,5]])#第1行第4列和第2行第5列的元素
print(a2[1:3,4:6])#第1行到第2行,第4列到第5列的数据,即一个小矩阵
print(a2[:,1])#:代表所有行,获取第1列的元素
print(a2[:,1:3])#获取第1列到第2列的所有行元素
print(a2[:,[1,3]])#获取第1列和第3列的所有行元素
5
[3 4]
[[3 7]
[5 4]]
[0 8 5 2]
[[0 6]
[8 3]
[5 3]
[2 2]]
[[0 4]
[8 0]
[5 2]
[2 9]]
#布尔索引
a3 = np.arange(24).reshape((4,6))
print(a3)
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]]
a3<10
array([[ True, True, True, True, True, True],
[ True, True, True, True, False, False],
[False, False, False, False, False, False],
[False, False, False, False, False, False]])
a3[a3<10]
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
a3[(a3>5)&(a3<10)]
array([6, 7, 8, 9])
a3[(a3>5)|(a3<10)]
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])
#数组值的替换a4 = np.random.randint(0,10,size=(3,5))a4
array([[0, 7, 9, 4, 0], [5, 7, 8, 2, 0], [9, 7, 8, 2, 2]])
#将某一行的数替换为另一行数a4[1]=np.array([1,2,3,4,5])a4
array([[0, 7, 9, 4, 0], [1, 2, 3, 4, 5], [9, 7, 8, 2, 2]])
#将某一行数全部替换为另一个数a4[0]=0a4
array([[0, 0, 0, 0, 0], [1, 2, 3, 4, 5], [9, 7, 8, 2, 2]])
#利用条件索引实现将所有小于5的数全部替换成0a4[a4<5]=0a4
array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 5], [9, 7, 8, 0, 0]])
#利用函数实现将数组中小于5的数替换成0,其余的变成1result = np.where(a4<5,0,1)print(result)
[[0 0 0 0 0] [0 0 0 0 1] [1 1 1 0 0]]
1.4数组的广播机制
import numpy as np
#数组与数之间的运算
a1 = np.random.randint(0,5,size=(3,5))
a1
array([[2, 1, 0, 3, 0],
[1, 3, 1, 4, 0],
[3, 1, 3, 4, 0]])
a1*2
array([[4, 2, 0, 6, 0],
[2, 6, 2, 8, 0],
[6, 2, 6, 8, 0]])
#数组与数组的计算
#shape一致
a2 = np.random.randint(0,5,size=(3,5))
a2
array([[3, 4, 1, 3, 2],
[2, 3, 0, 2, 0],
[1, 3, 2, 3, 2]])
a1+a2
array([[5, 5, 1, 6, 2], [3, 6, 1, 6, 0], [4, 4, 5, 7, 2]])
#shape不一致,但其中一个数组的行或者列为1
a3 = np.random.randint(0,5,size=(3,1))
print(a3)
print('='*30)
print(a1)
[[1]
[2]
[4]]
==============================
[[2 1 0 3 0]
[1 3 1 4 0]
[3 1 3 4 0]]
a1+a3#a3与a1的每一列都进行相加运算
array([[3, 2, 1, 4, 1],
[3, 5, 3, 6, 2],
[7, 5, 7, 8, 4]])
#shape为(3,8,2)与(8,1)或者(8,2)可以运算
#shape为(3,1,8)与(8,1)可以运算
1.5数组的形状操作
import numpy as np
#reshape&resize
#reshape将数组转换成指定的形状,然后返回转换后的结果,对于原数组的形状是不会改变的
#resize将数组转换成指定的形状。会直接修改数组本身,并不会返回任何值
a1 = np.random.randint(0,10,size=(3,4))
a1
array([[3, 9, 8, 6],
[5, 9, 0, 8],
[8, 0, 7, 2]])
a1.reshape((2,6))
array([[3, 9, 8, 6, 5, 9],
[0, 8, 8, 0, 7, 2]])
a1
array([[3, 9, 8, 6],
[5, 9, 0, 8],
[8, 0, 7, 2]])
a1.resize((4,3))
a1
array([[3, 9, 8], [6, 5, 9], [0, 8, 8], [0, 7, 2]])
#flatten&ravel#flatten是将数组转换成一维数组后,将这个拷贝返回回去,后续对这个一维数组改变不会影响原来的数组#ravel是将数组转换为一维数组后,将这个视图返回回去,后续对这个返回值进行修改会影响之前的数组
a2 = np.random.randint(0,10,size=(3,4))print(a2)
[[8 1 7 6] [6 1 1 5] [5 6 6 1]]
a3 = a2.flatten()a3[0]=100print(a2)
[[8 1 7 6] [6 1 1 5] [5 6 6 1]]
a4 = a2.ravel()a4[0]=100print(a2)
[[100 1 7 6] [ 6 1 1 5] [ 5 6 6 1]]
#vstake,列相同增加行#hstake,行相同增加列#concatenatevstack1 = np.random.randint(0,10,size=(3,4))vstack1
array([[4, 5, 0, 6], [4, 9, 1, 7], [5, 1, 5, 7]])
vstack2 = np.random.randint(0,10,size=(2,4))vstack2
array([[0, 5, 6, 6], [4, 8, 7, 3]])
vstack3 = np.vstack([vstack1,vstack2])#在前面的参数数组,叠加得到的数组中便排在前面#vstack3 = np.concatenate([vstack1,vstack2],axis=1)vstack3
array([[4, 5, 0, 6], [4, 9, 1, 7], [5, 1, 5, 7], [0, 5, 6, 6], [4, 8, 7, 3]])
h1 = np.random.randint(0,10,size=(3,4))h1
array([[9, 2, 0, 2], [6, 0, 8, 0], [0, 9, 6, 5]])
h2 = np.random.randint(0,10,size=(3,1))h2
array([[1], [5], [3]])
#h3 = np.hstack([h2,h1])vstack3 = np.concatenate([vstack1,vstack2],axis=0)h3
array([[1, 9, 2, 0, 2], [5, 6, 0, 8, 0], [3, 0, 9, 6, 5]])
h4 = np.concatenate([h2,h1],axis=None)#axis=0,水平方向叠加;axis=1,垂直方向叠加;axis=None,两个数组合成一个一维数组h4
array([1, 5, 3, 9, 2, 0, 2, 6, 0, 8, 0, 0, 9, 6, 5])
#hsplit指定分成几列#vsplit指定分成几行#array_split/split;参数axis,axis=1按照列进行切割;axis=0按照行进行切割hs1 = np.random.randint(0,10,size=(3,4))print(hs1)
[[0 7 9 3] [0 6 7 0] [4 3 3 6]]
np.hsplit(hs1,2)#只有一个数字参数时,必须满足原数组的列是该参数的整倍数
[array([[0, 7], [0, 6], [4, 3]]), array([[9, 3], [7, 0], [3, 6]])]
np.hsplit(hs1,(1,2))#在第1列和第2列前进行切割
[array([[0], [0], [4]]), array([[7], [6], [3]]), array([[9, 3], [7, 0], [3, 6]])]
vs1 = np.random.randint(0,10,size=(4,5))print(vs1)
[[9 6 1 0 4] [6 9 6 1 2] [6 5 3 6 6] [0 3 4 2 7]]
np.vsplit(vs1,4)
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2]]), array([[6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
np.vsplit(vs1,(1,3))#同上
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2], [6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
np.split(hs1,4,axis=1)
[array([[0], [0], [4]]), array([[7], [6], [3]]), array([[9], [7], [3]]), array([[3], [0], [6]])]
np.split(vs1,4,axis=0)
[array([[9, 6, 1, 0, 4]]), array([[6, 9, 6, 1, 2]]), array([[6, 5, 3, 6, 6]]), array([[0, 3, 4, 2, 7]])]
#数组的转置;T或者tarnspose
t1 = np.random.randint(0,10,size=(3,4))print(t1)
[[9 1 7 9] [0 2 6 8] [4 2 0 6]]
t1.T
array([[9, 0, 4],
[1, 2, 2],
[7, 6, 0],
[9, 8, 6]])
t2 = t1.transpose()
print("t2:\n",t2)
t2[0]=100
print("t1:\n",t1)
t2:
[[100 100 100]
[ 1 2 2]
[ 7 6 0]
[ 9 8 6]]
t1:
[[100 1 7 9]
[100 2 6 8]
[100 2 0 6]]
#两种方法都不会直接改变原数组,但是transpose方法返回的是一个视图,若对该视图进行改变则会相应修改原数组
1.6拷贝
import numpy as np
#
- 将数组变为一维数组的函数flatten和ravel,其中flatten就是深拷贝,ravel是浅拷贝
#不拷贝
a=np.arange(12)
b=a
print(b is a)
#浅拷贝
a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
c=a.view()
print(c is a)
False
c[0]=100
c
array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
a
array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
#深拷贝
d=a.copy()print(d is a)
False
a
array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
d[1]=200d
array([100, 200, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
a
array([100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
- 没有拷贝是指只是为某一区域的数据再次声明一个变量名且该变量名与原来的变量名使用同一片空间,如上例,a和b是等价的
- 浅拷贝和深拷贝后的数组与原来的数组都不是等价的,两者都声明了一个新的空间来存储变量名,不同的是浅拷贝没有拷贝数组的存储空间
1.7文件操作
import numpy as np
scores=np.random.randint(0,100,size=(20,2))
scores
array([[49, 80],
[91, 50],
[75, 24],
[81, 86],
[37, 31],
[62, 44],
[71, 82],
[21, 61],
[ 1, 48],
[22, 76],
[48, 55],
[52, 5],
[85, 18],
[19, 45],
[ 8, 43],
[ 8, 83],
[43, 82],
[88, 43],
[34, 78],
[33, 48]])
#保存为csv文件
np.savetxt("score.csv",scores,delimiter=",",header="英语,数学",comments="",fmt="%d")
#读取csv文件
b = np.loadtxt("score.csv",dtype=np.int,delimiter=",",skiprows=1)
b
array([[49, 80],
[91, 50],
[75, 24],
[81, 86],
[37, 31],
[62, 44],
[71, 82],
[21, 61],
[ 1, 48],
[22, 76],
[48, 55],
[52, 5],
[85, 18],
[19, 45],
[ 8, 43],
[ 8, 83],
[43, 82],
[88, 43],
[34, 78],
[33, 48]])
np.savetxt(frame,array,fmt="%.18e",delimiter=None)
- frame:要保存成为的文件名
- array:存入文件的数组
- fmt:写入文件的格式,例如:%d,%.2f
- delimiter:分割字符串,默认是空格
- header和comments一般同时使用,header定义了保存为文件后第一行的数据,但comments参数默认会在header的第一个元素前添加一个“#”,故一般设置commens为""
注: header的参数彼此之间的分割符必须与delimiter定义的分割符一致
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
- frame:要下载的文件名
- dtype:要下载成为的数据类型(可能会有数据转化,注意是否可转化)
- delimiter:分割字符串,默认是空格
- skiprows:跳过前面x行
- usecols:读取指定的列,用元组组合
- unpack:如果为true,读取出来的数组是转置后的
注: 一般读取时需要去掉首行的header,故避免出现数据转化的错误,设置skiprows参数为1