numpy
What is numpy?
科学计算的基础库,多用在大型、多维数组上执行数值运算
数组
创建数组
import numpy as np
a1 = np.array([1, 2, 3, 4, 5])
# range:生成一个序列;arrange:生成指定dtype的ndarray
a2 = np.array(range(1, 6))
a3 = np.arange(1, 6)
# 数组类型
print(type(a3))
# 数据类型
print(a3.dtype)
数组的数据类型
import numpy as np
a1 = np.array([1, 2, 3, 4, 5], dtype=float)
a2 = np.array(range(1, 6), dtype="f4")
a3 = np.arange(1, 6, dtype=float)
a4 = a1.astype('int8')
a5 = a1.astype(np.int8)
a6 = a1.astype('i1')
# 数据类型
print(a1.dtype) # float64
print(a4.dtype) # int8
print(a5.dtype) # int8
print(a6.dtype) # int8
P.S. astype不改变原数组类型,而是生成对应类型的新数组
import numpy as np
n = np.array([-0.746, 4.6, 9.4, 7.447, 10.455, 11.555])
around1 = np.around(n)
print(around1) # [ -1. 5. 9. 7. 10. 12.]
around2 = np.around(n, decimals=1)
print(around2) # [ -0.7 4.6 9.4 7.4 10.5 11.6]
around3 = np.around(n, decimals=-1)
print(around3) # [ -0. 0. 10. 10. 10. 10.]
数组形状
a = np.array([1, 2, 3, 4, 5, 6], dtype=float)
print(a.shape) # (6,)
b = a.reshape(2, 3)
print(a.shape) # (6,)
print(b.shape) # (2,3)
P.S. reshape不改变原数组类型,而是生成对应类型的新数组
b = np.array([[3, 4, 5, 6], [7, 8, 4, 5], [6, 7, 8, 9]])
print(b.reshape(1, 12)) # [[3 4 5 6 7 8 4 5 6 7 8 9]]
print(b.flatten()) # [3 4 5 6 7 8 4 5 6 7 8 9]
print(b)
''' [[3 4 5 6]
[7 8 4 5]
[6 7 8 9]]'''
在numpy中,用axis(轴)的概念代表维度
数组的计算
-
数组和数的计算:numpy具有广播机制,加减乘除运算中值会被广播到所有的元素上面
-
数组和数组的计算:数组位置对应的元素两两进行计算
P.S. 若数组维度不同:某一维度相同时,同样广播兼容,可在该维度上计算(比如a逐行和c进行运算);若无相同维度则报错
numpy读取数据
csv: comma separated value
np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
numpy基本操作
numpy的转置
numpy索引和切片
- 切片:和list一致,对于二维,例:
# 取行
print(t2[2])
# 取连续的多行
print(t2[2:])
# 取不连续的多行;注意方括号的使用
print(t2[[2,8,10]])
print(t2[1,:])
print(t2[2:,:])
print(t2[[2,10,3],:])
# 取列
print(t2[:,0])
# 取连续的多列
print(t2[:,2:])
# 取不连续的多列
print(t2[:,[0,2]])
# 取行和列,取第3行,第四列的值
a = t2[2,3]
print(a)
print(type(a)) # 依旧是numpy.int64类型
# 取多行和多列,取第3行到第五行,第2列到第4列的结果
# 取的是行和列交叉点的位置
b = t2[2:5,1:4]
print(b)
# 取多个不相邻的点 此处应该注意
# 选出来的结果是(0,0) (2,1) (2,3)
c = t2[[0,2,2],[0,1,3]]
-
布尔索引:结果生成由true和false组成的数组,可用于进行数值修改
例:
numpy数值修改
t[t>10] = 0
np.where(t<10,0,10) # 三元运算符,小于10的赋值为0,否则为10
t.clip(10,18) # 小于10的替换为10,大于18的替换为了18
特殊情况:nan,inf(+/-),均为float类型
数组的拼接
np.vstack((t1,t2)) # 竖直拼接
np.hstack((t1,t2)) # 水平拼接
数组的行列交换
t[[1,2],:] = t[[2,1],:] # 行交换
t[:,[1,2]] = t[:,[2,1]] # 列交换
Other methods
- np.zeros
- np.ones
- np.eye:对角线为1的正方形数组
- np.argmax(t,axis=0)
- np.argmin(t,axis=1)
np.random生成随机数
numpy中常用统计函数
- 求和:t.sum(axis=None)
- 均值:t.mean(a,axis=None) 受离群点的影响较大
- 中值:np.median(t,axis=None)
- 最大值:t.max(axis=None)
- 最小值:t.min(axis=None)
- 极值:np.ptp(t,axis=None) 即最大值和最小值之差
- 标准差:t.std(axis=None)
numpy的copy和view
- a=b 完全不复制,a和b相互影响
- a = b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
a = b.copy(),复制,a和b互不影响 - a = b.copy(),复制,a和b互不影响
An Example:合并两个国家的数据并加上国家来源
import numpy as np
us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"
us_data = np.loadtxt(us_data, delimiter=',', dtype=int)
uk_data = np.loadtxt(uk_data, delimiter=',', dtype=int)
zeros_data = np.zeros(us_data.shape[0], 1).astype(int)
ones_data = np.ones(us_data.shape[0], 1).astype(int)
us_data = np.hstack((us_data, zeros_data))
uk_data = np.hstack((uk_data, ones_data))
final_data = np.vstack(us_data, uk_data)