NumPy数值计算基础
1、利用array函数创建数组对象
array函数的格式:np.array(object, dtype,ndmin)
import numpy as np
data1 = [1,3,5,7]
w1 = np.array(data1)
print('w1',w1)
data2 = (2,4,6,8)
w2 = np.array(data2)
print('w2',w2)
data3 = [[1,2,3,4],[5,6,7,8]]
w3 = np.array(data3)
print('w3',w3)
dtype:指定义的数据类型
w4 = np.array([1,2,3,4],dtype = 'float64')
print(w2.dtype)
2、arange函数:创建等差一维数组
格式:np.arange([start, ]stop, [step, ]dtype)
注:输出包括 start 不包括stop
warray = np.arange(10) #产生一个0-10的随机数,包括0,不包括10
print(warray)
warray1 = np.arange(0,1,0.2)#产生一个0-1的随机数,步长为0.2
print(warray1)
3、linspace 函数:创建等差一维数组,接收元素数量作为参数。
np.linspace(start, stop, num,) 产生一个从start-stop的值,num 是产生几个数字
wr1 = np.linspace(0,10,4)
print(wr1)
4、logspace函数:创建等比一维数组
格式:np.logspace(start, stop, num)
注:参数中起始位和终止位代表的是10的幂(默认基数为10),第三个表示元素的个数
wr2= np.logspace(0,1,5) #0指的是10的0次幂 1 指的是10的1次幂 即产生1-10,产生5个
print(wr2)
5、专门创建数组的函数
(1).zeros函数:创建指定长度或形状的全0数组
格式:np.zeros(shape, dtype=float, order='C')
print(np.zeros(4))
print(np.zeros([3,3]))
(2).ones函数:创建指定长度或形状的全1数组
格式:np. ones(shape, dtype=None, order='C')
print(np.ones(5))
print(np.ones([2,3]))
(3).diag函数:创建一个对角阵。
格式:np.diag(v, k=0)
w1 = np.diag([1,2,3,4,5,6]) print(w1)
输出结果为:
6、ndarray对象属性
属性 |
说明 |
ndim |
返回数组的轴的个数 |
shape |
返回数组的维度 |
size |
返回数组元素个数 |
dtype |
返回数据类型 |
itemsize |
返回数组中每个元素的字节大小 |
print('秩数|轴数',w2.ndim)
print("维度",w2.shape)
print('元素的个数',w2.size)
print('数据类型',w2.dtype)
输出结果:
改变数组的shape属性
w2.shape=2,3
print('改变shape后',w2)
数组的类型转换
arr1 = np.arange(6)
print(arr1)
print(arr1.dtype) #类型为int32
arr2=arr1.astype(np.float64)
print(arr2.dtype) #类型为float64
7、生成随机数
在NumPy.random模块中,提供了多种随机数的生成函数。
如randint函数生成指定范围的随机整数来构成指定形状的数组。
random.randint(参数1,参数2)
参数1、参数2必须是整数
函数返回参数1和参数2之间的任意整数, 闭区间
arr = np.random.randint(100,500,size=(3,4)) #产生一个3行4列的数字,共12个
print(arr)
rand函数生成【0,1】的随机数
arr = np.random.rand(5) # 产生是0-1的随机数,产生5个 注意区分
np.arang(5))是产生0-5的随机数
print(arr)
arr1 = np.random.rand(4,2)#产生0-1的随机,矩阵是4行2列
print(arr1)
8、数组重塑
(1)对于定义好的数组,可以通过reshape方法改变其数据维度
arr1 = np.arange(8)
print(arr1)
arr2 = arr1.reshape(4,2);
print(arr2)
注:reshape的参数中的其中一个可以设置为-1,表示数组的维度可以通过数据本身来推断
arr1 = np.arange(12)
print('arr1',arr1)
arr2 = arr1.reshape(2,-1)
print('arr2',arr2)
(2)与reshape相反的方法是数据散开(ravel)或数据扁平化(flatten)
arr1 = np.arange(12).reshape(3,4)
print('arr1',arr1)
arr2 = arr1.ravel()
arr3 = arr1.flatten()
print('arr2',arr2)
print('arr3',arr3)
注:数据重塑不会改原来的数组
9、数组合并
hstack函数:实现横向合并
vstack函数:实现纵向组合是利用vstack将数组纵向合并;
concatenate函数:可以实现数组的横向或纵向合并,参数axis=1时进行横向合并,axis=0时进行纵向合并。
hstack
arr1 = np.arange(6).reshape(3,2)
print('arr1',arr1)
arr2 = arr1 * 2
print('arr2',arr2)
arr3 = np.hstack((arr1,arr2)) #横向合并
print('arr3',arr3)
Vstack
arr1 = np.arange(6).reshape(3,2)
print('arr1',arr1)
arr2 = arr1 * 2
print('arr2',arr2)
arr3 = np.vstack((arr1,arr2)) #纵向合并
print('arr3',arr3)
纵向合并输出结果:
concatenate:
arr1 = np.arange(6).reshape(3,2)
print('arr1',arr1)
arr2 = arr1 * 2
print('arr2',arr2)
print('横向输出',np.concatenate((arr1,arr2),axis=1)) # axis=1表示横向合并,
print('纵向输出',np.concatenate((arr1,arr2),axis=0)) # axis=0表示纵向合并
输出结果:
10、数组分割
与数组合并相反,hsplit函数、vsplit函数和split函数分别实现数组的横向、纵向和指定方向的分割。
注:split在参数axis=1时实现横向分割,axis=0时则进行纵向分割。
arr = np.arange(16).reshape(4,4)
#print('arr',arr) #print('横向分割为\n',np.hsplit(arr,2))
print('横向分割为\n',np.split(arr,2,axis=1)) #横向
#print('纵向分割为\n',np.vsplit(arr,2))
print('横向分割为\n',np.split(arr,2,axis=0)) #纵向
11、数组转置和轴对换
(1).数组转置是数组重塑的一种特殊形式,可以通过transpose方法进行转置。
注明:transpose(x,y ,z) x轴用0表示 y轴用1表示, Z轴用2表示,transpose(1,0)表示行、列调换了位置
transpose(0,1,2)
transpose(0,2,1) 表示y轴和z轴调换
transpose(1,0,2) 表示 x轴和y轴调换
arr = np.arange(6).reshape(3,2)
print('矩阵',arr)
print('转化矩阵',arr.transpose((1,0))) # x轴用0表示 y轴用1表示
(2).除了使用transpose外,可以直接利用数组的T属性进行数组转置。
arr = np.arange(6).reshape(3,2)
print('arr',arr)
print('转换后',arr.T)
(3)数组的轴对换swapaxes
arr = np.arange(6).reshape(3,2)
print('arr',arr)
print(arr.swapaxes(0,1))
以上三种方式的输出结果都一样,如下:
12、一维数组的索引
一维数组的索引类似Python中的列表
arr = np.arange(10) print(arr)
print(arr[2]) #2
print(arr[-1]) #倒数第一个,9
print(arr[1:4]) #结果为1,2,3
13、数组的复制copy
arr = np.arange(10)
print(arr)
arr1 = arr[-4:-1].copy()
print(arr1)
结果为:
14、数组的运算
数组之所以很强大是因为不需要通过循环就可以完成批量计算.
a = [1,2,3]
b = []
for i in a:
b.append(i*i)
print(b)
c = np.array([1,2,3])
d = c*2
print(d)
15、常用的ufunc函数运算
常用的ufunc函数运算有四则运算、比较运算和逻辑运算。
1)四则运算:
加(+)、减(-)、乘(*)、除(/)、幂(**)。数组间的四则运算表示对每个数组中的元素分别进行四则运算,所以形状必须相同。
2)比较运算:
>、=、
x = np.array([1,2,3])
y = np.array([4,5,6])
print( '相加',x+y)
print( '相减',x-y)
print('相乘',x*y)
print( '求幂',x**y)
x = np.array([1,2,3])
y = np.array([4,5,6])
print( '比较结果<',x',x>y)
print('比较结果==',x==y)
print('比较结果>=',x>=y)
print('比较结果!=',x!=y)
输出结果:
16、读/写文件
读文件 loadtxt
a = np.loadtxt('e:/a.txt') print(a)
写文件 savetxt
a = np.arange(0,12,0.5).reshape(4,-1)
np.savetxt('e:/b.txt',a,fmt='%.1f',delimiter=',')
17、排序Sort
(1).Sort函数对数据直接进行排序,调用改变原始数组,无返回值。
格式:numpy.sort(a, axis, kind, order)
arr = np.array([7,9,5,2,9,4,3,1,4,3])
print('原数组:',arr)
arr.sort()
print('排序后:',arr)
(2) 带轴向参数的sort排序 axis=1:横向,axis=0:纵向
arr = np.array([[4,2,9,5],[6,4,8,3],[1,6,2,4]])
print('原数组:\n',arr)
arr.sort(axis = 1) #沿横向排序
print('横向排序后:\n',arr)
输出结果:
(2).np.argsort(): 返回的是数组值从小到大的索引值;
arr = np.array([7,9,5,2,9,4,3,1,4,3])
print('原数组:',arr)
print('排序后:',arr.argsort()) #返回值为数组排序后的下标排列
print('显示较大的5个数:',arr[arr.argsort()][-5:])
输出结果:
(3)使用lexsort排序
a = ['lu','ba','lu']
b = ['cu','aa','db']
ind = np.lexsort((b,a))
print('ind',ind)
输出结果;
18、重复数据与去重
(1) 去重:在NumPy中,对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由大到小返回一个新的元组或者列表
names = np.array(['红色','蓝色','黄色','白色','红色'])
print('原数组:',names)
print('去重后的数组:',np.unique(names))
输出结果:
(2)重复数据:tile
统计分析中有时也需要把一个数据重复若干次,使用tile和repeat函数即可实现此功能。
tile函数的格式:np.tile(A, reps)
其中,参数A表示要重复的数组,reps表示重复次数。
repeat函数的格式:np.repeat(A, reps, axis = None)
“a”: 是需要重复的数组元素,
“repeats”: 是重复次数,
“axis”: 指定沿着哪个轴进行重复,axis = 0表示按行进行元素重复;axis = 1表示按列进行元素重复。
arr = np.arange(5)
print('原数组:',arr)
wy = np.tile(arr,3) #复复3次
print('重复数据处理:\n',wy)
输出结果:
(3)使用repeat函数实现数据重复
arr = np.arange(5)
print('原数组:',arr)
wy = np.tile(arr,3)
print('重复数据处理:\n',wy)
arr2 = np.array([[1,2,3],[4,5,6]])
print('重复数据处理:\n',arr2.repeat(2,axis=0))
输出结果
19、常用统计函数
NumPy中提供了很多用于统计分析的函数,常见的有sum、mean、std、var、min和max等。
几乎所有的统计函数在针对二维数组的时候需要注意轴的概念。
axis=0时表示沿着纵轴进行计算,axis=1时沿横轴进行计算。
arr = np.arange(20).reshape(4,5)
print('创建的数组:\n',arr)
print('数组的和:',np.sum(arr))
print('数组纵轴的和:',np.sum(arr,axis = 0))
print('数组横轴的和:',np.sum(arr,axis = 1))
print('数组的最大值:',np.max(arr))
print('数组的最小值:',np.min(arr))
输出结果为: