python数据分析系列(一)——Numpy的使用

1.numpy的导入以及查看版本

	>>> import numpy as np
	>>> print(np.__version__)
	1.15.4

2.创建一维(或多维)数组

	# 通过list初始化来创建
	>>> np.array([1,2,3,4,5])
	array([1, 2, 3, 4, 5])
	# 通过arange方法生成
	>>> np.arange(10)
	array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
	# 指定创建范围和步长
	>>> np.arange(3,10,2)
	array([3, 5, 7, 9])

	# 二维(3,3)
	>>> np.array([[1,2,3],[4,5,6],[7,8,9]])
	array([[1, 2, 3],
	       [4, 5, 6],
	       [7, 8, 9]])

	# 三维(2,2,2)
	>>> np.array([[[1,3],[2,4]],[[3,6],[4,8]]])
	array([[[1, 3],
        [2, 4]],

       [[3, 6],
        [4, 8]]])

3.创建布尔数组

	# 一维
	>>> np.full(3, True, dtype=bool)
	array([ True,  True,  True])
	
	# 二维
	>>> np.full((3, 3), True, dtype=bool)
	array([[ True,  True,  True],
	       [ True,  True,  True],
	       [ True,  True,  True]])

4.从数组中提取(或替换)满足指定条件的元素

	# 提取数组中的所有奇数
	>>> arr = np.arange(10)
	>>> arr[arr % 2 == 1]
	array([1, 3, 5, 7, 9])
	# 提取大于4的数
	>>> arr[arr > 4]
	array([5, 6, 7, 8, 9])

	# 替换所有奇数为-1
	>>> arr[arr % 2 == 1] = -1
	>>> arr
	array([ 0, -1,  2, -1,  4, -1,  6, -1,  8, -1])

5.改变数组的形状

	>>> arr = np.arange(12)
	>>> arr.reshape(2,6)
	array([[ 0,  1,  2,  3,  4,  5],
	       [ 6,  7,  8,  9, 10, 11]])
	# 设为-1维数会自动匹配
	>>> arr.reshape(3,-1)
	array([[ 0,  1,  2,  3],
	       [ 4,  5,  6,  7],
	       [ 8,  9, 10, 11]])
    >>> arr.reshape(2,2,3)
	array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

6.类型转换

	>>> a = np.arange(10)
	>>> a.dtype
	dtype('int32')
	# 转换为 str 类型
	>>> a.astype(str)
	array(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], dtype='<U11')
	# 转换为 float 类型
	>>> a.astype(float)
	array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

7.垂直合并数组

	>>> a = np.arange(8).reshape(2,4)
	>>> b = np.arange(8,12)
	# 方法1
	>>> np.vstack((a, b))
	array([[ 0,  1,  2,  3],
	       [ 4,  5,  6,  7],
	       [ 8,  9, 10, 11]])
	# 方法2
	>>> np.row_stack((a,b))
	array([[ 0,  1,  2,  3],
	       [ 4,  5,  6,  7],
	       [ 8,  9, 10, 11]])
	# 方法3,注意 concatenate 垂直合并的两个数组维数要一致
	>>> np.concatenate([a, b], axis=0)
	Traceback (most recent call last):
	  File "<pyshell#99>", line 1, in <module>
	    np.concatenate([a, b], axis=0)
	ValueError: all the input arrays must have same number of dimensions
	
	>>> np.concatenate([a, [b,b]], axis=0)
	array([[ 0,  1,  2,  3],
	       [ 4,  5,  6,  7],
	       [ 8,  9, 10, 11],
	       [ 8,  9, 10, 11]])
	# 方法4,合并的两个数组维数要一致
	>>> np.r_[a,[b,b]]
	array([[ 0,  1,  2,  3],
	       [ 4,  5,  6,  7],
	       [ 8,  9, 10, 11],
	       [ 8,  9, 10, 11]])

8.水平合并数组

	>>> a = np.arange(8).reshape(2,4)
	>>> b = np.arange(8,12).reshape(2,2)
	# 方法1
	>>> np.hstack((a,b))
	array([[ 0,  1,  2,  3,  8,  9],
	       [ 4,  5,  6,  7, 10, 11]])
	# 方法2
	>>> np.column_stack((a,b))
	array([[ 0,  1,  2,  3,  8,  9],
	       [ 4,  5,  6,  7, 10, 11]])
	# 方法3
	>>> np.concatenate([a, b], axis=1)
	array([[ 0,  1,  2,  3,  8,  9],
	       [ 4,  5,  6,  7, 10, 11]])
	# 方法4
	>>> np.c_[a,b]
	array([[ 0,  1,  2,  3,  8,  9],
	       [ 4,  5,  6,  7, 10, 11]])

9.保存和读取txt(或csv)

	>>> filename = 'data.txt'	# or  filename = 'data.csv'
	>>> a = np.arange(12).reshape(3,4)
	
	# 保存:fmt 指定保存的数据类型,delimiter 指定分隔符
	>>> np.savetxt(filename, a, fmt='%d', delimiter=',')
	
	# 读取:dtype 指定读取后的类型,delimiter 指定分隔符
	>>> np.loadtxt(filename, dtype=float, delimiter=',')
	array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])

10.数组的特殊运算

	>>> a = np.arange(10)
	>>> a.sum()	# 求和
	45
	>>> a.max()	# 求最大值
	9
	>>> a.min()	# 求最小值
	0
	>>> a.mean()	# 求平均值
	4.5
	>>> a.ptp()	# 求数组中元素最大值与最小值的差
	9
	>>> np.median(a)	# 求数组的中位数
	4.5
	>>> np.std(a)	# 求数组的标准差
	2.8722813232690143
	>>> np.var(a)	# 求数组的方差
	8.25
	>>> a ** 2	# a中每个数平方
	array([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81], dtype=int32)
	>>> a.dot(a)	# 点积运算,对应元素相乘后求和,返回一个标量
	285
	>>> a.dot(a.T)	# a.T是a的转置,也可以用 a.transpose()
	285

11.创建零矩阵、1矩阵、单位阵

	>>> np.zeros((2, 3))	# 零矩阵
	array([[0., 0., 0.],
	       [0., 0., 0.]])
	
	>>> np.ones((4, 3))	# 1矩阵
	array([[1., 1., 1.],
	       [1., 1., 1.],
	       [1., 1., 1.],
	       [1., 1., 1.]])
	
	>>> np.identity(3)	# 单位阵,也可以用 np.eye(3)
	array([[1., 0., 0.],
	       [0., 1., 0.],
	       [0., 0., 1.]])

12.矩阵的特殊运算
(1)array内积运算np.dot()

	# 一维内积,对应元素相乘后求和
	>>> A=np.array([1, 2, 3])
	>>> B=np.array([4, 5, 6])
	>>> A.dot(B)	# or A.dot(B.T)
	32
	# 二维内积,矩阵A[m,n]的列数等于矩阵B[n,p]的行数,与线性代数的矩阵乘法相同(C[i,j] = sum(A[i,k] * B[k,i]), k in [i,n])
	# 假设C=A·B,则C[1,1] = A[1,1]*B[1,1] + A[1,2]*B[2,1] + A[1,3]*B[3,1] = 1*2 + 2*2 + 3*2 = 12
	>>> A=np.array([[1, 2, 3], [4, 5, 6]])		# (2, 3)
	>>> B=np.array([[2, 3], [2, 3], [2, 3]])	# (3, 2)
	>>> A.dot(B)	# or np.dot(A, B)
	array([[12, 18],
	       [30, 45]])

(2)array元素乘法运算np.multiply()

	# 元素的乘法运算是矩阵指对应元素相乘,可以用np.multiply(),也可以直接写" * "运算符
	# 元素的乘法运算要求两个矩阵的维数必须要一致
	# 一维数组
	>>> A=np.array([1, 2, 3])
	>>> B=np.array([4, 5, 6])
	>>> A * B
	array([ 4, 10, 18])
	>>> np.multiply(A, B)
	array([ 4, 10, 18])
	
	# 二维数组
	>>> A = np.arange(8)
	>>> A = A.reshape(2,4)
	>>> A
	array([[0, 1, 2, 3],
	       [4, 5, 6, 7]])
	>>> A * A
	array([[ 0,  1,  4,  9],
	       [16, 25, 36, 49]])
	>>> np.multiply(A, A)
	array([[ 0,  1,  4,  9],
	       [16, 25, 36, 49]])

(3)matrix乘法运算

	# matrix乘法运算可使用np.matmul(),也可使用" * "运算符
	# matrix乘法运算与array的二维内积相同,所以也可以用np.dot()
	>>> MA = np.matrix([[1, 2, 3], [4, 5, 6]])
	>>> MB = np.matrix([[2, 3], [2, 3], [2, 3]])
	>>> MA
	matrix([[1, 2, 3],
	        [4, 5, 6]])
	>>> MB
	matrix([[2, 3],
	        [2, 3],
	        [2, 3]])
	>>> MA * MB
	matrix([[12, 18],
	        [30, 45]])
	>>> np.matmul(MA, MB)		# or np.dot(MA, MB), MA.dot(MB)
	matrix([[12, 18],
	        [30, 45]])

(4)笛卡尔积运算

	# 笛卡尔积也称为直积,其实就是集合的映射关系,可以用itertools.product()来实现
	# 比如A={a, b},B={1,2,3},则A和B的笛卡尔积为{(a,1), (a,2), (a,3), (b,1), (b,2), (b,3)}
	>>> import itertools
	>>> A = np.array(['a', 'b'])
	>>> B = np.array([1, 2, 3])
	>>> D = itertools.product(A, B)
	>>> list(D)	# 直接转list,list中每个元素为tuple类型
	[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3)]
	
	# 也可以通过循环来遍历D
	>>> for d in D:
		print(d)

	('a', 1)
	('a', 2)
	('a', 3)
	('b', 1)
	('b', 2)
	('b', 3)

待更新:

  1. python数据分析系列(二)——Matplotlib的使用
  2. python数据分析系列(三)——Scipy的使用
  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值