NumPy(Numerical Python)是Python数值计算的开源扩展。该工具可用于存储和处理大型矩阵。它比Python自己的嵌套列表结构更高效。它支持多维数组和矩阵操作。此外,它还提供了大量用于数组操作的数学库。NumPy用于处理数组。
NumPy的前身Numeric最初是由Jim Hugunin和其他合作者开发的。Python本身有列表和数组,但对于大型数据处理,其结构有许多缺点。Python并不能很好地支持多维数组和矩阵,因此NumPy填补了这些空白,它提供了两个适用于这类数据的数值计算的基本对象:Ndarray和Ufunc。简而言之,NumPy是一个Python库。
(1)NumPy可以帮助你研究:
(2)学习NumPy的先决条件
在学习NumPy编程之前,您必须具备Python语言。
#Example 1.1
import numpy
myArr=numpy.array([0,1,2,3,4,5])
print(myArr)
# [0 1 2 3 4 5]
# import numpy 是一个NumPy命令,用于将NumPy库导入到当前程序中。
import numpy as np
myArr=np.array([0,1,2,3,4,5])
print(myArr)
# [0 1 2 3 4 5]
# import numpy as np定义了np作为Numpy库的别名
import numpy as np
arr1=np.array([0,1,2,3,4,5])
print(arr1)
arr2=np.arange(0,6) # 不包括6
print(arr2)
# [0 1 2 3 4 5]
# [0 1 2 3 4 5]
import numpy as np
myArray=np.array(100)
print(myArray)
# 100
import numpy as np
myArray=np.array([0,1,2,3,4,5])
print(myArray)
# [0 1 2 3 4 5]
import numpy as np
myArray=np.array([[0,1,2],[3,4,5]])
print(myArray)
# [[0 1 2][3 4 5]]
import numpy as np
myArr=np.array([[[0,1,2],[3,4,5],[6,7,8]]])
print(myArr)
# [[[0 1 2][3 4 5][6 7 8]]]
import numpy as np
arr3=np.array([0,1,2,3],ndmin=3) # 定义三维数组
arr4=np.array([0,1,2,3],ndmin=4) # 定义四维数组
arr5=np.array([0,1,2,3],ndmin=5) # 定义五维数组
print(arr3)
print(arr4)
print(arr5)
# [[[0 1 2 3]]]
# [[[[0 1 2 3]]]]
# [[[[[0 1 2 3]]]]]
import numpy as np
arr0=np.array(100) # 0维
arr1=np.array([0,1,2,3,4,5]) # 1维
arr2=np.array([[0,1,2],[3,4,5]]) # 2维
arr3=np.array([[[0,1,2],[3,4,5],[6,7,8]]]) # 3维
print(arr0.ndim)
print(arr1.ndim)
print(arr2.ndim)
print(arr3.ndim)
# 0
# 1
# 2
# 3
import numpy as np
myArray=np.array([10,11,12,13,14])
print(myArray[0])
print(myArray[4])
# 10
# 14
import numpy as np
myArray=np.array([10,11,12,13,14])
print(myArray[0]+myArray[3])
print(myArray[1]*myArray[2])
# 23
# 132
import numpy as np
arr=np.array([[10,11,12,13,14],[15,16,17,18,19]])
print("The value in row 0 and col 3 is:", arr[0,3])
print("The value in row 1 and col 2 is:", arr[1,2])
# The value in row 0 and col 3 is:13
# The value in row 1 and col 2 is:17
import numpy as np
arr=np.array([[10,11,12,13,14],[15,16,17,18,19]])
print("The value in row 0 and last col is:", arr[0,-1])
print("The value in last row and col 2 is:", arr[-1,2])
print("The value in last row and last col is:", arr[-1,-1])
# The value in row 0 and last col is:14
# The value in row 0 and last col is:17
# The value in row 0 and last col is:19
import numpy as np
arr=np.array([10,11,12,13,14,15,16,17,18])
print(arr[2:7:2])
print(arr[2:7])
# [12 14 16]
# [12 13 14 15 16])
import numpy as np
arr=np.array([10,11,12,13,14,15,16,17,18])
print(arr[:3])
print(arr[2:])
# [10 11 12]
# [12 13 14 15 16 17]
import numpy as np
arr=np.array([10,11,12,13,14,15,16,17,18])
print(arr[-5:-2])
print(arr[-7:-3])
# [14 15 16]
# [12 13 14 15]
import numpy as np
arr=np.array([[10,11,12,13,14],[15,16,17,18,19]])
print(arr[0:2,2:4])
# [[12 13][17 18]]
2D切片的第二个语法是:
myArray[row1,col1:col2]
访问指定行(row1),列从col1到col2-1的元素
import numpy as np
arr=np.array([[10,11,12,13,14],[15,16,17,18,19]])
print(arr[0,2:4])
# [12 13]
2D切片的第三个语法是:
myArray[row1:row2,col1]
访问指定列col1,行从row1到row2-1的元素
import numpy as np
arr=np.array([[10,11,12,13,14],[15,16,17,18,19]])
print(arr[0:2,2])
# [12 17]
import numpy as np
arr1=np.array([10,11,12,13])
print(arr1.dtype)
arr2=np.array(['Matlab','in','8','Hours'])
print(arr2.dtype)
# int64
#
代码解析: 代码解析 代码解析: 代码解析: 代码解析: 数组reshape的要求是:原始数组中的元素个数必须等于维度的乘积。 代码解析: 计算过程
arr1.dtype和arr2.dtype返回数组的数据类型
int64表示64位整数类型
设置数组数据类型的语法:
dtype=“datatype”import numpy as np
myArr=np.array([10,20,30,40],dtype="S")
print(myArr.dtype)
# |S2
dtype='S’设置数组的数据类型为字符串
" | "符号表示这里不适用使用字节顺序符号。
“S2”表示数组数据类型为String,每个元素的大小为2字节。
设置数组数据类型的语法:
dtype=“datatype”import numpy as np
nyArr=np.array([10,11,12,13],dtype="i2")
print(myArr.dtype)
# int16
dtype='i2’设置数组的数据类型为int16
'i2’是int16的类型码
转换数组数据类型的语法
myArr.astype(‘data_type’)# astype('i')将数组转换成整数类型
import numpy as np
myArr=np.array([0.99,0.88,0.23,2.99])
arr=myArr.astype('i')
print(arr)
print(arr.dtype)
# [0 0 0 2]
# int32
# astype(bool)将数组转换成bool类型
import numpy as np
myArr=np.array([0,1,2,3])
arr=myArr.astype(bool)
print(arr)
print(arr.dtype)
# [False True True True]
# bool
数组拷贝的语法是:array2=array1.copy()import numpy as np
arr1=np.array([0,1,2,3,4])
arr2=arr1.copy()
arr2[0]=100
print(arr1)
print(arr2)
# [0 1 2 3 4]
# [100 1 2 3 4]
将arr1数组拷贝到数组arr2
arr1与arr2相互不影响
创建数组视图的语法:array2=array1.view()import numpy as np
arr1=np.array([0,1,2,3,4])
arr2=arr1.view()
arr2[0]=100
print(arr1)
print(arr2)
# [100 1 2 3 4]
# [100 1 2 3 4]
创建arr1数组视图arr2
arr1与arr2相互影响
“array.base"可以检查新数组和旧数组的相关性。
如果newArray是从oldArray复制过来的,那么” newArray.base将返回“None”。
如果newArray是oldArray的视图,则" newArray.base"将返回一个新的数组。import numpy as np
myArr=np.array([0,1,2,3,4])
copyArr=myArr.copy()
viewArr=myArr.view()
print(copyArr.base)
print(viewArr.base)
# None
# [0 1 2 3 4]
数组形状是指数组中有多少行和多少列。语法为:array.shapeimport numpy as np
myArr=np.array([[0,1,2,3],[4,5,6,7],[2,4,6,8]])
print(myArr.shape)
# (3, 4)
# myArr.shape返回一个(3,4),这表示“myArr”有3行和4列。
myArr=np.array([1,2,3,4,5],ndim=2)
print(myArr)
print("The array shape is:", myArr.shape)
# [[1 2 3 4 5]]
# The array shape is:(1,5)
# ndmin=2表示建立一个二维数组
# myArr.shape返回一个(1,5),这表示“myArr”有1行和5列。
数组reshape意味着修改数组的shape
reshape从1D到2D的语法是:2dArray=1dArray.reshape(rows,cols)import numpy as np
myArr=np.array([0,1,2,3,4,5,6,7,8,9,10,11])
newArr=myArr.reshape(3,4)
print(newArr)
# [[0 1 2 3][4 5 6 7][8 9 10 11]]
# myArr.reshape(3,4)表示把1D数组reshape成2d数组,“myArr”有3行和4列。
如果在reshape方法中没有为其中一个维度指定确切的数字,则可以使用“-1”作为参数。NumPy会自动计算这个数字。三个语法是:
arr.reshape(-1,rows,cols)
arr.reshape(layer,-1,cols)
arr.reshape(layer,rows,-1)import numpy as np
myArr=np.array([1,2,3,4,5,6,7,8,9,10,11,12])
newArr=myArr.reshape(-1,2,3)
print(newArr)
# [[[1 2 3][4 5 6]][[7 8 9][10 11 12]]]
flatten数组意味着将多维数组reshape到1d数组
将数组reshape到1d数组的语法是:
myArr.reshape(-1)import numpy as np
myArr=np.array([[1,2,3],[4,5,6],[7,8,9]])
newArr=myArr.reshape(-1)
print(newArr)
# [1 2 3 4 5 6 7 8 9]
myArr是一个2D数组
myArr.reshape(-1)使用-1参数reshape2D数组为1D数组
遍历一维数组的语法是:
for num in myArrayimport numpy as np
myArr=np.array([10,11,12])
for num in myArr:
print(num)
# 10
# 11
# 12
遍历二维数组的语法是:
for num in myArrayimport numpy as np
myArr=np.array([[10,11,12],[13,14,15]])
for num in myArr:
print(num)
# [10 11 12]
# [13 14 15]
遍历三维数组的语法是:
for num in myArrayimport numpy as np
myArr=np.array([[[10,11,12],[13,14,15]],[[16,17,18],[19,20,21]]]
for num in myArr:
print(num)
# [[10,11,12],[13,14,15]]
# [[16,17,18],[19,20,21]]
要获得每个实际的元素值(标量),可以使用niter()来遍历数组中的所有元素。语法是:nditer(myArray)import numpy as np
myArr=np.array([[10,11],[12,13]])
for num in np.nditer(myArr):
print(num)
# 10
# 11
# 12
# 13
使用step来遍历主要用于二维数组,语法为:
nditer(myArr[:,::step])import numpy as np
myArr=np.array([[10,11,12,13],[14,15,16,17]])
for num in np.nditer(myArr[:,::2]):
print(num)
# 10
# 12
# 14
# 16
可以为数组中的每个元素指定序号。ndenumerate(myArray)import numpy as np
myArr=np.array([0,1,2,3])
for id,num in np.ndenumerate(myArr):
print(id,num)
# (0,) 0
# (1,) 1
# (2,) 2
# (3,) 3
连接数组是指将两个或多个数组的元素连接到一个数组中。连接数组的语法为:np.concatenate((arr1,arr2))import numpy as np
a1=np.array([0,1,2])
a2=np.array([3,4,5])
myArr=np.concatenate((a1,a2))
print(myArr)
# [0 1 2 3 4 5]
# np.concatenate((a1,a2))将数组a1和a2连接成单一数组
当连接两个数组时候,使用参数axis来表示连接维度
axis=0,垂直方向连接
axis=1,水平方向连接import numpy as np
a1=np.array([[11,12,13],[14,15,16]])
a2=np.array([[21,22,23],[24,25,26]])
myArr=np.concatenate((a1,a2),axis=0)
print(myArr)
# [[11 12 13][14 15 16][21 22 23][24 25 26]]
myArr2=np.concatenate((a1,a2),axis=1)
print(myArr2)
# [[11 12 13 21 22 23][14 15 16 24 25 26]]
# axis默认是0
stack()可以连接两个数组,但它将两个一维数组连接为一个二维数组,并将两个二维数组连接为一个三维数组。语法为:
np.stack((array1,array2),axis=0)
np.stack((array1,array2),axis=1)a1=np.array([[11,12,13],[14,15,16]])
a2=np.array([[21,22,23],[24,25,26]])
myArr=np.stack((a1,a2),axis=0)
print(myArr)
# [[[11,12,13],[14,15,16]], [[21,22,23],[24,25,26]]]
myArr2=np.stack((a1,a2),axis=1)
print(myArr2)
# [[[11,12,13],[21,22,23]], [[14,15,16],[24,25,26]]]
# “np.Stack((a1, a2),axis=1) "水平连接两个数组,因为参数" axis=1 "。
vstack()垂直连接数组,语法是:
np.vstack((arr1,arr2))import numpy as np
a1=np.array([[11,12,13],[14,15,16]])
a2=np.array([[21,22,23],[24,25,26]])
myArr=np.vstack((a1,a2))
print(myArr)
# [[[11,12,13],[14,15,16]], [[21,22,23],[24,25,26]]]
hstack()垂直连接数组,语法是:
np.hstack((arr1,arr2))import numpy as np
a1=np.array([[11,12,13],[14,15,16]])
a2=np.array([[21,22,23],[24,25,26]])
myArr=np.hstack((a1,a2))
print(myArr)
# [[11 12 13 21 22 23][14 15 16 24 25 26]]
语法是:np.dstack((arr1,arr2))
默认情况下,是水平连接import numpy as np
a1=np.array([11,12,13])
a2=np.array([14,15,16])
myArr=np.dstack((a1,a2))
print(myArr)
# [[[11 14][12 15][13 16]]]
语法是:np.dstack((arr1,arr2))
默认情况下,是水平连接import numpy as np
a1=np.array([[11],[12],[13]])
a2=np.array([[14],[15],[16]])
myArr=np.dstack((a1,a2))
print(myArr)
# [[[11 14][[12 15]][[13 16]]]
语法是:np.sort(array)myArr = np.array([[ 2, 0, 3, 9], [ 7, 5, 6, 4 ]])
print(np.sort(myArr))
# [[0, 2, 3, 9], [4, 5, 6, 7]]
拆分数组就是将一个数组分成几个数组
语法是:array_split(array,number)
参数number意思是拆分成多少个数组
import numpy as np
myArr=np.array([10,20,30,40,50,60])
arr=np.array_split(myArr,3)
print(arr)
# [array([10, 20]), array([30, 40]), array([50, 60])]
myArr2=np.array([10,20,30,40,50,60,70])
arr2=np.array_split(myArr2,3)
print(arr2)
# [array([10, 20, 30]), array([40, 50]), array([60, 70])]
语法是:arr[index]import numpy as np
myArr=np.array([10,20,30,40,50,60])
arr=np.array_split(myArr,3)
print(arr)
print(arr[0])
print(arr[1])
print(arr[2])
# [array([10, 20]), array([30, 40]), array([50, 60])]
#[10 20]
#[30 40]
#[50 60]
语法是:array_split(array,number)
参数number意思是拆分成多少个数组import numpy as np
myArr=np.array([[1,2],[3,4],[5,6],[7,8]])
arr=np.array_split(myArr,2)
print(arr)
# [array([[1, 2], [3, 4]]), array([[5, 6],[7, 8]])]
语法是:vsplit(array,number)
参数number意思是拆分成多少个数组import numpy as np
myArr=np.array([[1,2],[3,4],[5,6],[7,8]])
arr=np.vsplit(myArr,2)
print(arr)
#[array([[1, 2],
# [3, 4]]), array([[5, 6],
# [7, 8]])]
import numpy as np
myArr=np.array([[1,2],[3,4],[5,6],[7,8]])
arr=np.hsplit(myArr,2)
print(arr)
# [array([[1],[3],[5],[7]]),
#array([[2], [4], [6], [8]])]
我们可以通过元素值找到匹配的索引,并返回一个包含匹配索引的新数组。
语法是:where(array==value)import numpy as np
myArr=np.array([0,93,2,93,4,5,93])
arr=np.where(myArr==93)
print(arr)
# (array([1, 3, 6], dtype=int64),)
# 奇数偶数
even=np.where(myArr%2==0)
print(even)
odd=np.where(myArr%2==1)
print(odd)
# (array([0, 2, 4], dtype=int64),)
# (array([1, 3, 5, 6], dtype=int64),)
语法1:searchsorted(array,value)
语法2:searchsorted(array,[v1,v2,v3,…])import numpy as np
myArr=np.array([24,35,46,57,68])
arr1=np.searchsorted(myArr,45)
arr2=np.searchsorted(myArr,47)
print(arr1)
print(arr2)
# 2
# 3
# searchsorted(myArr,45)发现45应该放置的索引值,即使45不在数组中
arr=np.searchsorted(myArr,[15,45,65])
print(arr)
# [1 6 6]
我们可以使用布尔值来过滤数组中的元素。
如果该值为true,则将显示元素。
如果值为false,则不会显示元素。import numpy as np
myArr=np.array([0,1,2,3,4,5])
arr=myArr[[True, False, True, False, False, True]]
print(arr)
# [0 2 5]
我们可以使用条件来过滤数组的元素。
如果值满足条件,将显示元素。
如果值不满足条件,则不会显示元素。import numpy as np
myArr=np.array([0,1,2,3,4,5])
filter=myArr>=2
arr=myArr[filter]
print(filter)
print(arr)
# [False False True True True True]
#[2 3 4 5]
ufuncs意思是通用函数,实际上是NumPy函数。利用“ufuncs”实现向量化,快速运行NumPy程序。我们可以将“ufunc”视为NumPy内置函数。import numpy as np
list1=[10,20,30,40]
list2=[80,70,60,50]
list3=np.add(list1,list2) # add() is a NumPy ufunc
print(list3)
# [90 90 90 90]
语法:type(np.function_name)
如果返回 import numpy as np
print(type(np.add))
print(type(np.subtract))
print(type(np.multiply))
print(type(np.divide))
#
创建自己的ufunc的步骤如下:
1.定义普通的Python函数
2.将定义好的函数添加到NumPy的ufunc库,语法是:frompyfunc(myFunction,number1,number2)
number1:输入参数个数
number2:输出参数个数import numpy as np
def myMultiply(a,b):
return a*b
myMultiply=np.frompyfunc(myMultiply,2,1)
print(myMultiply([0,1,2,3,4],[5,6,7,8,9]))
# [0 6 14 24 36]
import numpy as np
arr1=np.array([10,20,30])
arr2=np.array([1,2,3])
a=np.add(arr1,arr2)
s=np.subtract(arr1,arr2)
m=np.multiply(arr1,arr2)
d=np.divide(arr1,arr2)
p = np.power(arr1, arr2)
m = np.mod(arr1, arr2)
r = np.remainder(arr1, arr2)
print(a)
print(s)
print(m)
print(d)
print(p)
print(m)
print(r)
# [11 22 33]
#[ 9 18 27]
#[10 40 90]
#[10. 10. 10.]
#[10 400 27000]
#[0 0 0]
#[0 0 0]
trunc()&fix()删除小数点并返回最接近零的数字.
语法:
trunc([floating_numbers])
fix([floating_numbers])import numpy as np
t = np.trunc([-2.7, 2.7])
f = np.fix([-2.7,2.7])
print(t)
print(f)
# [-2.,2.]
# [-2.,2.]
around()返回四舍五入的值
ceil()返回一个大于自身的最小整数
floor()返回小于自身的最大整数import numpy as np
a=np.around(7.555,2) # 2表示保留两位有效数字
c=np.ceil(7.555)
f=np.floor(7.555)
print(a)
print(c)
print(f)
# 7.56
# 8.0
# 7.0
import numpy as np
arr=np.arange(1,4)
print(np.log2(arr))
print(np.log10(arr))
print(np.log(arr)) # 以e为底
# [0. 1. 1.5849625]
# [0. 0.30103 0.47712125]
# [0. 0.69314718 1.09861229]
form math import log
log(number,base)from math import log
import numpy as np
print(log(16,4))
# 2
我们可以得到多个数组中所有元素值的和。sum([array1,array2,array3])import numpy as np
a1=np.array([10,20,30])
a2=np.array([10,20,30])
a3=np.array([10,20,30])
myArr=np.sum([a1,a2,a3])
print(myArr)
# 180
参数" axis=0 "可以使NumPy垂直求和多个数组中的元素值。import numpy as np
a1=np.array([10,20,30])
a2=np.array([10,20,30])
myArr=np.sum([a1,a2],axis=0)
print(myArr)
# [20 40 60]
参数" axis=1 "可以使NumPy水平求和多个数组中的元素值。import numpy as np
a1=np.array([10,20,30])
a2=np.array([10,20,30])
myArr=np.sum([a1,a2],axis=1)
print(myArr)
# [60 60]
import numpy as np
myArr=np.array([10,20,30,40])
arr=np.cumsum(myArr)
print(arr)
# [10 30 60 100]
# 计算过程[ (10) (10+20) (10+20+30) (10+20+30+40) ]
计算规则:下一个元素-上一个元素import numpy as np
myArr=np.array([3,5,7,8])
arr=np.diff(myArr)
print(arr)
# [2 2 1]
语法:diff(myArr,n=number)
参数number是差分的次数import numpy as np
myArr=np.array([2,5,6,8])
arr=np.diff(myArr,n=2)
print(arr)
# [-2 1]
# diff(myArr,n=2)返回数组myArr经过两次差分后的结果
import numpy as np
myArr=np.array([10,20,30,40])
num=np.prod(myArr)
print(num) # 240000=10*20*30*40
# np.prod(myArr)返回myArr数组中所有元素的乘积
我们可以得到多个数组中所有元素值的乘积。import numpy as np
myArr1=np.array([10,20])
myArr2=np.array([30,40])
num=np.prod([myArr1,myArr2])
print(num) # 240000=10*20*30*40
import numpy as np
myArr1=np.array([10,20])
myArr2=np.array([30,40])
num=np.prod([myArr1,myArr2],axis=0)
print(num)
# [300 800]
import numpy as np
myArr1=np.array([10,20])
myArr2=np.array([30,40])
num=np.prod([myArr1,myArr2],axis=1)
print(num)
# [200 1200]
import numpy as np
myArr = np.array([1, 2, 3, 4])
arr = np.cumprod(myArr)
print(arr)
# [ 1 2 6 24]
# [ (1) (1X2) (1X2X3) (1X2X3X4) ]
import numpy as np
arr=np.arange(2,7)
print(divmod(arr,2))
# 商,余数
# (array([1, 1, 2, 2, 3], dtype=int32), array([0, 1, 0, 1, 0], dtype=int32))
Lowest Common Multiple(LCM)import numpy as np
myArr=np.array([2,7,8])
num=np.lcm.reduce(myArr)
print(num)
# 56
Greatest Common Divisor(GCD)import numpy as np
myArr=np.array([12,6,21,9,24])
num=np.gcd.reduce(myArr)
print(num)
# 3
12/3=4, 6/3=2, 21/3=7, 9/3=3, 24/3=8.
有两种方法可以随机重新排列数组的元素序列:
random.permutation(array)
random.shuffle(array)
两个函数的区别是:" permutation() “只改变数组的副本。” shuffle() "改变原始数组。from numpy import random
import numpy as np
myArr=np.array([1,2,3,4,5])
arr=random.permutation(myArr)
print(arr)
random.shuffle(myArr)
print(myArr)
# [1 4 2 3 5]
#[3 5 2 4 1]