NumPy 学习笔记

NumPy是一个功能强大的Python库,主要用于对多维数组执行计算。NumPy这个词来源于两个单词 NumericalPython。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。

Numpy 有两种基本对象:

  • ndarray (N-dimensional array object)多维数组:存储单一数据类型的多维数组
  • ufunc (universal function object)通用函数:能够对数组进行处理的函数对象,大部分能够作用于数组的数学函数如三角函数等,都是 ufunc 对象

1.创建ndarray数组

ndarray是储存单一数据类型的多维数组

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
 
Numpy 创建 数组

>>>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]]
NumPy索引

一维索引:

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])      # 8print(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]])]
"""

2.NumPy矩阵与通用函数

创建numpy矩阵
>>>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)

3.利用numpy进行统计分析

读写文件

NumPy 文件读写主要有二进制的文件读写和文件列表形式的数据读写两种形式

  1. save 函数是以二进制的格式保存数据。 格式: np.save ("./save_arr ", arr1)
  2. load 函数是从二进制的文件中读取数据。 格式: np.load("./ save_arr.npy")
  3. savez 函数可以将多个数组保存到一个文件中。 格式: np.savez(’./savez_arr’,arr1,arr2)
  4. 存储时可以省略扩展名,但读取时不能省略扩展名

读取文本格式的数据(TXT CSV 格式)

  1. savetxt 函数是将数组写到某种分隔符隔开的文本文件中。 格式: np.savetxt("./arr.txt", arr, fmt="%d", delimiter=",") ## fmt="%d"表示保存为整数,delimiter=","表示用’,'隔开。
  2. loadtxt 函数执行的是把文件加载到一个二维数组中。 格式: np.loadtxt("./arr.txt",delimiter=",")
  3. genfromtxt 函数面向的是结构化数组和缺失数据。 格式: np.genfromtxt("./arr2.txt", delimiter = “,”)
二进制文件读写
  1. save() 函数是以二进制的格式保存数据; load() 函数是从二进制的文件中读取数据
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)
  1. savez() 函数可以将多个数组保存到一个文件中
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'])
文本文件读写
  1. savetxt() 函数是将数组写到某种分隔符隔开的文本文件中; loadtxt() 函数执行的是把文件加载到一个二维数组中
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.]]
  1. genfromtxt 函数面向的是结构化数组和缺失数据(基本操作)
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.]
使用函数进行简单的统计分析
排序
直接排序(sort函数)
>>>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 时,表示沿着纵轴计算;

你可能感兴趣的:(NumPy,Python)