numpy最基础内容
1. 属性与创建方法
1.1 创建一个numpy
np.array(data),data就是要填入的矩阵。
import numpy as np
array = np.array([[1,2,3],[4,5,6]])
同时,也可以通过特定的方法进行创建
import numpy as np
# 创建零矩阵、一矩阵(数全是1)
a = np.ones((3,3), dtype=np.int)
print(a)
a = np.zeros((3,3),dtype=np.float32)
print(a)
# 从一个到另一个,并设置步长(从10到20,步长为2)
a = np.arange(10,20,2)
print(a)
1.2 numpy的几个属性
维度、形状、元素个数、数据类型
import numpy as np
array = np.array([[1,2,3],[4,5,6]])
print(array)
print(array.ndim) #元素维度
print(array.shape) #元素形状
print(array.size) #元素个数
a = np.array([2,3,4],dtype=np.int)
print(a.dtype) #数据类型
1.3 改变numpy的属性
import numpy as np
# 改变形状
a = np.arange(12)
a = a.reshape((3,4))
print(a)
# 把a到b的数字分成c份(把从1到10的数分成20份,注意:浮点数有误差)
a = np.linspace(1,10,20)
print(a)
2. numpy的基本运算
2.1 加法与幂次方
由于算术运算都比较相似(tensor、python基础运算),因此我们就简单提及就行
import numpy as np
a = np.array([1,2,3,4])
b = np.array([5,6,7,8])
c = a + b
print(c)
d = a ** b
print(d)
2.2 求和
求和函数不那么重要,但是有个axis 参数非常重要。这个表示的是轴,一般我们不选择的时候,axis 可能是 None,也可能是 0 。另外,axis 还有两个值:0 与 1 . 0 表示的是按照列进行排列,而 1 表示的是按照行表示。
import numpy as np
# 求和的几个内容
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print("a = ", a)
# 对于全部的进行求和
sum = np.sum(a)
print("sum = ", sum)
# 对于列进行求和
row_sum = np.sum(a, axis= 0)
print("row_sum = ",row_sum)
# 对于行进行求和
col_sum = np.sum(a, axis= 1)
print("col_sum = ", col_sum)
结果:
a = [[1 2 3]
[4 5 6]
[7 8 9]]
sum = 45
row_sum = [12 15 18]
col_sum = [ 6 15 24]
2.3平均数、中位数、转置等
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
# 平均值
average = np.average(a)
print("average = ",average)
# 中位数
median = np.median(a)
print("median = ", median)
# 转置
transpose = a.T
# 或者 transpose = np.transpose(a)
print("transpose of a = ",transpose)
3. numpy 的索引与选择数据
这个主要都是实操环节,其实内容与 python计算 或者 tensor 差不多
import numpy as np
# 索引与选择数据
a = np.arange(10)
print(a[3])
# 转化为二维数组
b = a.reshape(2,5)
print(b[1])
print(b[1][0])
# 当然,我们也可以使用切片
print(b[1][ 2 : ])
# 选择大于某个值,简单易操作
print(b > 5)
print(b[b > 5])
结果:
3
[5 6 7 8 9]
5
[7 8 9]
[[False False False False False]
[False True True True True]]
[6 7 8 9]
4. numpy 合并、分割、复制
合并就是由多个矩阵合成一个矩阵,而分割则是合并的逆运算。同时,在这里我们仍然强调 axis 的使用。
axis = 0 是列、 axis = 1 是行
主要使用到的函数:vstack、hstack、split、vsplit、hsplit、array_split
4.1 合并
import numpy as np
# 合并
a = np.array([1,2,3])
b = np.array([4,5,6])
#垂直合并
c = np.vstack((a,b))
print(c)
c = np.stack((a,b),0)
print(c)
# 水平合并
d = np.hstack((a,b))
print(d)
d = np.stack((a,b),axis=1) # 自动转置,然后水平合并
print(d)
结果:
[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[1 2 3 4 5 6]
[[1 4]
[2 5]
[3 6]]
4.2 分割
import numpy as np
# 分割
a = np.arange(12).reshape((3,4))
print(a)
# 垂直分割,分为两份
b1 = np.split(a,2,axis=1)
b2 = np.hsplit(a,2)
print(b1)
print(b2)
# 水平分割,分成三份
c1 = np.split(a,3,axis=0)
c2 = np.vsplit(a,3)
print(c1)
print(c2)
# 不等量分割,分成两份
d = np.array_split(a,2,axis=0)
print(d)
结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
[array([[0, 1, 2, 3],
[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
从上面两个对比,可能会有些疑问:水平与垂直到底谁的 axis 是0、谁是1 ?
这个我们大可不必这么去想,只需要知道是按行还是按列就行了。
axis = 0 与 v 开头都是按列操作、axis = 1 与 h 开头都是按行操作。不论是分割还是合并都是如此。
4.3 复制
这个讲述的内容主要是赋值与复制。这个跟python中的完全一致。
import numpy as np
# 复制
a = np.array([1,2,3,4])
b = a # 相当于起了一个别名
a[1] = 100
print(b)
# 注意对比
b = a.copy() # 这个才是真正的复制
print(b)
a[1] = 200
print(b)
结果:
[ 1 100 3 4]
[ 1 100 3 4]
[ 1 100 3 4]
5. numpy 数组的添加、插入、删除、去重
5.1 添加
import numpy as np
# 添加:numpy.append(arr, value, axis)
a = np.array([[1,2,3],[4,5,6]])
b = np.append(a,[7,8,9])
print(b)
# 注意一下 axis
# 垂直添加
c = np.append(a,[[7,8,9]],axis=0)
print(c)
# 水平添加
d = np.append(a,[[5,5,5],[7,8,9]],axis=1)
print(d)
结果:
[1 2 3 4 5 6 7 8 9]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
5.2 插入
# 插入
# 插入:numpy.insert(arr, obj, values, axis) obj是位置,就是第obj位的后面
a = np.array([[1,2],[3,4],[5,6]])
b = np.insert(a,3,[11,12])
print(b)
#
c = np.insert(a, 1, [11], axis= 0) #这个 11 自动变换
print(c)
d = np.insert(a, 1, 11, axis= 1)
print(d)
结果:
[ 1 2 3 11 12 4 5 6]
[[ 1 2]
[11 11]
[ 3 4]
[ 5 6]]
[[ 1 11 2]
[ 3 11 4]
[ 5 11 6]]
5.3 删除
# 删除
# 删除:numpy.delete(arr, obj, axis)
# 删除包括添加之类的,由于做完之后很大概率不会是原来的形式3*4之类的,所以弄成了一维数组
a = np.arange(12).reshape(3,4)
print(a)
# 一次删除一个,但是做成了一维数组
b = np.delete(a, 1, axis=None)
print(b)
# 一次删除一行
b = np.delete(a, 1,axis=0)
print(b)
# 一次删除一列
c = np.delete(a,1,axis=1)
print(c)
# 一次切掉几个,切片的方式
d = np.delete(a, np.s_[3:6])
print(d)
结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[ 0 2 3 4 5 6 7 8 9 10 11]
[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 0 2 3]
[ 4 6 7]
[ 8 10 11]]
[ 0 1 2 6 7 8 9 10 11]
5.4 去重
# 去重
# 去重:numpy.unique(arr)
a = np.array([5,2,6,2,7,5,6,2,9])
b = np.unique(a)
print(b)
# 得到去重的索引值,前一个是元素,后一个是索引值,最后的是detype
c = np.unique(a, return_index=True)
print(c)
# 得到去重的数量
d = np.unique(a, return_counts=True)
print(d)
结果:
[2 5 6 7 9]
(array([2, 5, 6, 7, 9]), array([1, 0, 2, 4, 8], dtype=int64))
(array([2, 5, 6, 7, 9]), array([3, 2, 2, 1, 1], dtype=int64))
6. numpy的字符串函数
内容包括:拼接的两种形式、重复、居中、分割、换行分割、删除特定字符、插入拼接、字符串替换
# 字符串函数
# 对数组的元素进行字符串拼接
a = np.char.add(["hello "],["world"])
print(a)
# 分别进行
b = np.char.add(["hello ","hi "],["Mr.Wang","Mr.Li"])
print(b)
# 生成重复的字符串
# numpy.char.multiply()
a = np.char.multiply("对不起", 10)
print(a)
# 字符串居中
# np.char.center()
a = np.char.center("hello world", 30, fillchar="#" ) #分别为输出字符串,一共占有多少个位置,空的部分填充什么
print(a)
# 字符串分割
a = np.char.split("www.baidu.com",sep=".")
print(a)
# 换行分割
a = np.char.splitlines("i\nlove\nyou\n")
print(a)
# 删除开头与结尾的特定字符
a = np.char.strip(" hello world ", " ")
print(a)
# 插入字符串拼接
a = np.char.join("/","hello world") # 把第一个放到第二个中每一个字符内
print(a)
# 字符串替换
a = np.char.replace(" i love you", "you", "me")
print(a)
结果:
[2 5 6 7 9]
(array([2, 5, 6, 7, 9]), array([1, 0, 2, 4, 8], dtype=int64))
(array([2, 5, 6, 7, 9]), array([3, 2, 2, 1, 1], dtype=int64))
PS D:\python> & D:/Anaconda/python.exe d:/python/venv/study_pytorch1.py
['hello world']
['hello Mr.Wang' 'hi Mr.Li']
对不起对不起对不起对不起对不起对不起对不起对不起对不起对不起
#########hello world##########
['www', 'baidu', 'com']
['i', 'love', 'you']
hello world
h/e/l/l/o/ /w/o/r/l/d
i love me
7. numpy的数学函数
7.1 基本函数
内容包括:三角函数、舍入函数、向下(上)取整、统计函数
# numpy的数学函数
# 三角函数
a = np.array([0,30,45,60,90])
# 根据度数转化为正弦值(先转化为弧度再进行sin)
a_sin = np.sin(a*np.pi/180)
print(a_sin)
#舍入函数:numpy.around(arr,decimals) 四舍五入,第一个是数组,第二个是舍入位数
a = np.array([1,0.222,0.5556,0.1346])
b = np.around(a,1) #保留一位小数
print(b)
# 向下取整:np.floor() 向上取整:np.ceil()
c = np.floor(a)
d = np.ceil(a)
print(c)
print(d)
结果:
[0. 0.5 0.70710678 0.8660254 1. ]
[1. 0.2 0.6 0.1]
[1. 0. 0. 0.]
[1. 1. 1. 1.]
7.2 统计函数
# numpy统计函数
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print(a)
# 按轴获取最大最小值
# numpy.amin() numpy.amax 求最大最小值
b = np.amin(a,axis=1) # 按行比大小(每一行最小的提取出来)
print(b)
c = np.amax(a,axis=0) #按列比大小
print(c)
# 极差(最大最小的差值)
d = np.ptp(a)
print(d)
# 水平方向(按行)的每一个元素的极差
e = np.ptp(a,axis=1)
print(e)
# 当然,axis = 0 就是按列的了!!!
# 百分位数
# 某学生考了54分,其百分位为70%。意味着70%的学生考的比54分低,30%的学生考的比54分高
a = np.array([[10,7,4],[3,2,1]])
# 百分位数表示中位数(当然,也可以按照轴进行计算中位数)
b = np.percentile(a,50)
print(b)
# 中位数直接计算方法(当然,也可以按照轴进行计算中位数)
b = np.median(a)
print(b)
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
# 求算数平均值(可按轴)
b = np.mean(a)
print(b)
# 标准差(方差的根号)
# 数据平均值分散程度
c = np.std(a)
print(c)
# 方差
d = np.var(a)
print(d)
结果:
[[3 7 5]
[8 4 3]
[2 4 9]]
[3 3 2]
[8 7 9]
7
[4 5 7]
3.5
3.5
3.6666666666666665
1.4907119849998598
2.2222222222222223
8. numpy 的IO操作
主要是几种形式的存入与读入
# numpy IO操作
# numpy.save() 可以将数组数据存入磁盘中
a = np.array([1,2,3,4,5])
np.save('outfile.npy', a)
# numpy.load 将数据从磁盘中读取出来
b = np.load("outfile.npy")
print(b)
# np.savez() 可以将多个数组保存到文件
a = np.array([[1,2,3],[4,5,6]])
b = np.array([7,8,9])
c = np.arange(0,1,0.1)
np.savez("data_of_mine.npz",a,b,c) # 想取名字,可以这样:np.savez("data_of_mine.npz",a=a,b=b,c=c),这样,名字就是a、b、c
d = np.load("data_of_mine.npz")
print(d.files)
print(d['arr_0'])
# 以文本的形式存放数据
a = np.array([1,2,3,4,5,6])
np.savetxt("out.txt",a)
b = np.loadtxt("out.txt")
print(b)