NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词
Numerical
和Python
。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。
Numpy 有两种基本对象:
ndarray是储存单一数据类型的多维数组
属性 | 说明 |
---|---|
ndim | 返回int。表示数组的维度 |
shape | 返回tuple。表示数组的尺寸,对于n行m列的矩阵,形状为(n,m) |
size | 数组元素的总数。这等于shape的元素的乘积。 |
dtype | 返回data-type。一个描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。另外NumPy提供它自己的类型。 |
itemsize | 返回int。数组中每个元素的字节大小。例如,元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。 |
>>>import numpy as np
>>>arr1 = np.array([1,2,3,4,5]) #创建一维数组
>>>print(arr1)
[1 2 3 4 5]
>>>arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])#创建二维数组
>>>print(arr2)
[[1 2 3]
[4 5 6]
[7 8 9]]
>>>print(arr2.shape)#查看数组结构
(3, 3)
>>>print(arr2.dtype)#查看数组类型
int64
>>>print(arr2.size)#查看数组元素个数
9
>>>print(np.arange(0,1,0.1))#使用arange创建数组
[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
>>>print(np.linspace(0,1,12))#使用linspace创建数组
[0. 0.09090909 0.18181818 0.27272727 0.36363636 0.45454545
0.54545455 0.63636364 0.72727273 0.81818182 0.90909091 1. ]
>>>print(np.logspace(0,2,20))#使用logspace创建数组
[ 1. 1.27427499 1.62377674 2.06913808 2.6366509
3.35981829 4.2813324 5.45559478 6.95192796 8.8586679
11.28837892 14.38449888 18.32980711 23.35721469 29.76351442
37.92690191 48.32930239 61.58482111 78.47599704 100. ]
>>>print(np.zeros((2,3)))#创建全零数组
[[0. 0. 0.]
[0. 0. 0.]]
>>>print(np.eye(3))#创建类似单位矩阵
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
>>>print(np.diag([1,2,3,4]))#类似对角数组
[[1 0 0 0]
[0 2 0 0]
[0 0 3 0]
[0 0 0 4]]
>>>print(np.ones((5,3)))#全一的数组
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
>>>print(np.random.random(10))
[0.2963573 0.15934191 0.67011865 0.43421664 0.63754906 0.69432137
0.96818238 0.90476899 0.49598125 0.40941893]
>>>print(np.random.rand(10,5))#服从均匀分布的随机数
......
>>>print(np.random.randn(10,5))#服从正态分布的随机数
......
>>>print(np.random.randint(2,10,size=[2,5]))#生成给定范围的随机数
[[8 6 7 9 5]
[4 2 9 9 5]]
一维索引:
import numpy as np
A = np.arange(3,15) # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
print(A[3]) # 6
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]])
"""
print(A[2])
# [11 12 13 14]
二维索引:
print(A[1][1]) # 8
print(A[1, 1]) # 8
print(A[1, 1:3]) # [8 9]
for row in A:
print(row)
"""
[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]
"""
for column in A.T:
print(column)
"""
[ 3, 7, 11]
[ 4, 8, 12]
[ 5, 9, 13]
[ 6, 10, 14]
"""
#flatten是一个展开性质的函数,将多维的矩阵进行展开成1行的数列
print(A.flatten()) # array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>>arr = np.arange(10)
>>>print(arr)
[0 1 2 3 4 5 6 7 8 9]
>>>print(arr.reshape(2,5))
[[0 1 2 3 4]
[5 6 7 8 9]]
#展平数组
>>>arr = np.arange(12).reshape(3,4)
>>>print(arr.ravel())
[ 0 1 2 3 4 5 6 7 8 9 10 11]
#使用flatten展平数组
arr.flatten() #横向展平
arr.flatten('F') #纵向展平
import numpy as np
A = np.array([1,1,1])
B = np.array([2,2,2])
#上下合并:
print(np.vstack((A,B))) # vertical stack
"""
[[1,1,1]
[2,2,2]]
"""
#左右合并
D = np.hstack((A,B)) # horizontal stack
# [1,1,1,2,2,2]
import numpy as np
A = np.arange(12).reshape((3, 4))
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
##############################对等分割################################
#纵向分割
print(np.split(A, 2, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2, 3],
[ 6, 7],
[10, 11]])]
"""
#横向分割
print(np.split(A, 3, axis=0))
"""
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
"""
##############################不等量分割################################
print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]),
array([[ 2],
[ 6],
[10]]),
array([[ 3],
[ 7],
[11]])]
"""
>>>matr1 = np.mat("1 2 3;4 5 6;7 8 9")
>>>matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
[[1 2 3]
[4 5 6]
[7 8 9]]
>>>m1 = np.mat("1 2 3;4 5 6;7 8 9")
>>>m2 = np.matrix([[1,3,5],[7,9,11],[13,15,17]])
>>>print(np.bmat("m1 m2;m2 m1"))#使用bmat函数创建矩阵
[[ 1 2 3 1 3 5]
[ 4 5 6 7 9 11]
[ 7 8 9 13 15 17]
[ 1 3 5 1 2 3]
[ 7 9 11 4 5 6]
[13 15 17 7 8 9]]
import numpy as np
########################一维矩阵#######################
a=np.array([10,20,30,40]) # array([10, 20, 30, 40])
b=np.arange(4) # array([0, 1, 2, 3])
c=a-b # array([10, 19, 28, 37])
c=a+b # array([10, 21, 32, 43])
c=a*b # array([ 0, 20, 60, 120])
#在Numpy中,想要求出矩阵中各个元素的乘方需要依赖双星符号 **,即:
c=b**2 # array([0, 1, 4, 9])
#当需要对矩阵中每一项元素进行函数运算时:
c=10*np.sin(a) # array([-5.44021111, 9.12945251, -9.88031624, 7.4511316 ])
#对print函数进行一些修改可以进行逻辑判断:
print(b<3) # array([ True, True, True, False], dtype=bool)
########################多维矩阵#######################
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
#对应元素相乘
c=a*b
#标准矩阵相乘
c_dot = np.dot(a,b)
c_dot_2 = a.dot(b)
#对矩阵中所有元素进行求和,寻找最小值,寻找最大值的操作:
np.sum(a)
np.min(a)
np.max(a)
#需要对行或者列进行查找运算,要在上述代码中为 axis 进行赋值。 当axis的值为0的时候,将会以列作为查找单元, 当axis的值为1的时候,将会以行作为查找单元。
print("sum =",np.sum(a,axis=1))
print("min =",np.min(a,axis=0))
print("max =",np.max(a,axis=1))
import numpy as np
A = np.arange(2,14).reshape((3,4))
# argmin() 和 argmax() 两个函数分别对应着求矩阵中最小元素和最大元素的索引。
print(np.argmin(A)) # 0
print(np.argmax(A)) # 11
#计算统计中的均值
print(np.mean(A)) # 7.5 mean()函数还有另外一种写法: print(A.mean())
print(np.average(A)) # 7.5
#求解中位数的函数:
print(A.median()) # 7.5
#累加函数
print(np.cumsum(A))
#累差函数
print(np.diff(A))
#对所有元素进行仿照列表一样的排序操作
print(np.sort(A))
#矩阵的转置两种表示方法:
print(np.transpose(A))
print(A.T)
NumPy 文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式
读取文本格式的数据(TXT CSV 格式)
import numpy as np
arr1 = np.arange(40).reshape((5,8))
print(arr1)
# 保存二进制文件,npy格式是一个数组的文件保存
np.save('./save_arr',arr1)
arr3 = np.load('./save_arr.npy') # 读取二进制文件
print(arr3)
import numpy as np
arr1 = np.arange(40).reshape((5,8))
arr2 = np.arange(1,10,1)
# print(arr1)
# print(arr2)
np.savez('./savez_arr',arr1,arr2) # 保存二进制文件,npz多个数组的文件保存
load_data = np.load('./savez_arr.npz') # 读取二进制文件
print(load_data)
print(type(load_data))
# 可遍历文件中的键值(也可以通过开启断点来获取)
# for i,k in load_data.items():
# print(i,k)
# 结果:
# arr_0 [[ 0 1 2 3 4 5 6 7]
# [ 8 9 10 11 12 13 14 15]
# [16 17 18 19 20 21 22 23]
# [24 25 26 27 28 29 30 31]
# [32 33 34 35 36 37 38 39]]
# arr_1 [1 2 3 4 5 6 7 8 9]
print(load_data['arr_0'])
print(load_data['arr_1'])
import numpy as np
arr = np.arange(0,9,1).reshape(3,-1) # -1的意思是根据行数自动匹配列数
print(arr)
# 结果:
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
# fmt='%d'表示保存为整数,delimiter=","表示用','隔开
np.savetxt('arr.txt',arr,fmt='%d',delimiter=',') # 保存
load_txt = np.loadtxt('arr.txt',delimiter=',') # 读取
print(load_txt)
# 结果:
# [[ 0. 1. 2.]
# [ 3. 4. 5.]
# [ 6. 7. 8.]]
import numpy as np
arr = np.arange(0,9,1).reshape(3,-1) # -1的意思是根据行数自动匹配列数
# print(arr)
# 结果:
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
# fmt='%d'表示保存为整数,delimiter=","表示用','隔开
np.savetxt('./arr2.txt',arr,fmt='%d',delimiter=',') # 保存
# skip_header从哪行开启读取
load_txt = np.genfromtxt('./arr2.txt',delimiter=',',skip_header=1) # 读取
print(load_txt)
# 结果:
# [[ 3. 4. 5.]
# [ 6. 7. 8.]]
# 二维数组切片方式
print(load_txt[1:2,0:3])
# 结果:
# [[ 6. 7. 8.]]
print(load_txt[0:3,0])
# 结果: [ 3. 6.]
>>>np.random.seed(42)
>>>arr=np.random.randint(1,10,size=10)
>>>print(arr)
[7 4 8 5 7 3 7 8 5 4]
>>>arr.sort()
>>>print(arr)
[3 4 4 5 5 7 7 7 8 8]
>>>arr = np.random.randint(1,10,size = (3,3))
>>>print(arr)
[[8 8 3]
[6 5 2]
[8 6 2]]
>>>arr.sort(axis=1)#沿着横轴排序
>>>print(arr)
[[3 8 8]
[2 5 6]
[2 6 8]]
>>>arr.sort(axis=0)#沿着纵排序
>>>print(arr)
[[2 5 6]
[2 6 8]
[3 8 8]]
>>>arr = np.array([2,3,6,8,0,7])
>>>print(arr)
[2 3 6 8 0 7]
>>>print(arr.argsort())#返回值为重新排序值的下标
[4 0 1 2 5 3]
>>>a = np.array([2,3,1,5,7])
>>>b = np.array([23,5,22,65,88])
>>>c = np.array([400,200,110,112,321])
>>>d = np.lexsort((a,b,c))
>>>print(list(zip(a[d],b[d],c[d])))
[(1, 22, 110), (5, 65, 112), (3, 5, 200), (7, 88, 321), (2, 23, 400)]
>>>names = np.array(['a','b','b','s','a','b','d','s','a'])
>>>print(names)
['a' 'b' 'b' 's' 'a' 'b' 'd' 's' 'a']
>>>print(np.unique(names))
['a' 'b' 'd' 's']
>>>arr = np.arange(5)
>>>print(np.tile(arr,3))
[0 1 2 3 4 0 1 2 3 4 0 1 2 3 4]
# 类似的还有repeat函数,可以指定哪个轴进行重复
numpy.repeat(a, repeats,axis=None)
//axis=0 按行进行元素重复
//axis=0 按列进行重复
函数 | 说明 |
---|---|
sum | 计算数组中的和 |
mean | 计算数组中的均值 |
var | 计算数组中的方差 |
std | 计算数组中的标准差 |
max | 计算数组中的最大值 |
min | 计算数组中的最小值 |
argmax | 返回数组中最大元素的索引 |
argmin | 返回数组中最小元素的索引 |
cumsum | 计算数组中所有元素的累计和 |
cumprod | 计算数组中所有元素的累计积 |
注意: 每个统计函数都可以按行和列来统计计算; 当 axis=1 时,表示沿着横轴计算; 当 axis=0 时,表示沿着纵轴计算;