numpy快速上手

一.简单介绍

NumPy是高性能科学计算和数据分析的基础包,其对象是N维数组(ndarray)。

用它来处理数据比用内置的Python循环快了至少一个数量级。

下面从以下几点内容进行总结:

1.创建ndarray的几种方式

2.改变数组的数据类型、形状和维数

3.基本数组统计方法

4.常见的元素级函数

5.排序

6.将条件逻辑表述为数组运算,np.where

7.重复操作,repeat和tile

8.数组合并与拆分

9.线性代数运算

二.代码示例

1.创建ndarray的几种方式

代码示例:

import numpy as np 


'''1.创建ndarray的几种方式'''
print('1.创建ndarray的几种方式')


a=np.array([[1,2,3,4],[2,4,6,8]],dtype=np.float64)
print('np.array(list or tuple),dtype用于设置数据类型')
print(a)


b=np.arange(1,21,2).reshape(2, 5)
print('np.arange类似于range,reshape用于设置数组维数及形状')
print(b)


c=np.zeros((2,3,4))
print('np.zeros创建全0数组,类似的还有np.ones,np.empty,np.ones_like(a)')
print(c)


d=np.linspace(1,19,10)
print('np.linspace(1,19,10)创建1到19之间取10个数的一维数组')
print(d)


e=np.random.randn(5, 4)
print('np.random类型创建随机数组')
print(e)

运行结果:


2.改变数组的数据类型、形状和维数

代码示例:

print('2.改变数组的数据类型、形状和维数,注意数组本身并没有变化')

a1=a.astype(np.int32)#数据变为4字节整数类型
a2=a1.reshape(4,-1)#由2行4列变为4行2列,这里-1改为2是一样
a3=a2[np.newaxis,:]#二维变成三维,跟a2.reshape(1,4,2)等价
a4=a3.ravel('F')#按照列优先的顺序变成一维的,没有'F'则默认行优先
a5=a.T#转置
print('a\n',a)
print('a1\n',a1)
print('a2\n',a2)
print('a3\n',a3)
print('a4\n',a4)
print('a5\n',a5)

运行结果:


3.基本数组统计方法

代码示例:

print('3.基本数组统计方法')

print('a1\n',a1)
print('a1的最小值\n',a1.min())
print('a1的最大值\n',a1.max())
print('a1的平均值\n',a1.mean())
print('a1的标准差\n',a1.std())
print('a1的方差\n',a1.var())
print('只对轴0,即每列上的数求和\n',a1.sum(0))
print('累积,cumprod(),默认行优先\n',a1.cumprod())
print('累和,cumsum(1)求轴1,即每行上的数的累计和\n',a1.cumsum(1))

运行结果:


4.常见的元素级函数
4.1.一元函数

代码示例:

print('4.常见元素级函数')
print('4.1.一元函数')

arr = np.random.randint(-2,3,size=(2,4))
#创建了一个二维数组,数据是-2到2之间的随机整数
print(arr)
print('np.abs求绝对值\n',np.abs(arr))
print('np.sin求正弦\n',np.sin(arr))#类似的有sinh,arcsin,cos,tan
print('np.square平方后再开方np.sqrt\n',np.sqrt(np.square(arr)))
print('e的x次方\n',np.exp(arr))#log用于求lnx
print('np.isnan哪些值是NaN(不是数字)\n',np.isnan(arr))
remainder, whole_part = np.modf(arr)#小数和整数部分形成两个独立的数组
np.sign(arr)#arr中的元素根据正负性改为1、-1或0

运行结果:


4.2.二元函数,数组必须具有相同shape

代码示例:

print('4.2.二元函数,数组必须具有相同shape')

f=np.arange(1,7).reshape(2,3)
g=np.ones_like(f)*2
print('f\n',f)
print('g\n',g)
print('f+g,np.add\n',np.add(f,g))
print('f-g,np.subtract\n',np.subtract(f,g))
print('f*g,np.multiply\n',np.multiply(f,g))
print('f/g,np.divide\n',np.divide(f,g))
print('f/g,取整数部分\n',np.floor_divide(f,g))
print('f/g的余数,np.floor_divide\n',np.mod(f,g))
print('f的g次方,np.power\n',np.power(f,g))
print('比较f和g,取较大的数np.maximum\n',np.maximum(f,g))#较小数minimum

运行结果:


4.3.若数组没有相同的形状,则是广播运算,但也必须有一条轴的形状一样

代码示例:

print('4.3.若数组没有相同的形状,则是广播运算,但也必须有一条轴的形状一样')

#现在计算每个数减去所在列(轴0)的平均值'
print('f是2行3列,shape是(2,3)\n',f)
h=f.mean(0)#计算每一列的平均值
print('h是一维的,有3列,shape是(3,)\n',h)
print('f与h列数相同,可以直接用f-h\n',f-h)

#下面计算每个数减去所在行(轴1)的平均值
i=f.mean(1)#计算每一行的平均值
print('i是一维的,有2列,shape是(2,)\n',i)
print('i需要先转换成2行的形状,跟f的相同才能计算\n',i.reshape(2,1))
print('f-i.reshape(2,1)\n',f-i.reshape(2,1))

运行结果:


5.排序,sort默认对行上的元素排序

代码示例:

print('5.排序sort,默认对行上的元素排序')

arr1 = np.random.randint(1,50,size=(2, 5))
print(arr1)
print('对列上的元素排序,np.sort返回的是一个视图\n',np.sort(arr1,axis=0))
arr2=arr1.copy()
arr2.sort(0)
print('直接调用sort函数时是直接修改数组\n',arr2)

print('下面这个例子对数据排序后取出了它的10%分位数')
large_arr =np.random.permutation(1000)#1000个随机数
large_arr.sort()
print(large_arr[int(0.01 * len(large_arr))]) # 10% quantile

运行结果:


6.将条件逻辑表述为数组运算,np.where

代码示例:

print('6.将条件逻辑表述为数组运算,np.where')

print('这个例子把小于0的数字改成0')
arr3 = np.random.randn(2,4)
print(np.where(arr3<0,0,arr3))

print('这个例子取出两组数据中较大的数')
x=np.array([5,2,6,5,7])
y=np.array([3,7,9,5,5])
result=np.where(x>=y,x,y)
print(result)
#可以直接使用np.maximum(x,y)

运行结果:


7.重复操作,repeat和tile

代码示例:

print('7.重复操作,repeat和tile')
print('repeat是对元素的重复操作,而tile是对整个数组的重复操作')
arr4=np.arange(1,9).reshape(2,4)
print('arr4\n',arr4)

print('arr4.repeat或np.repeat(arr4,),([2,3],axis=0)表示第一行重复一次,第二行重复2次')
print(arr4.repeat([2,3],axis=0))

print('只能用np.tile(arr4,),([2,3])表示在轴0上重复一次,在轴1 上重复2次')
print(np.tile(arr4,[2,3]))

运行结果:


8.数组合并与拆分
8.1.面向列的合并,np.hstack,np.column_stack,np.c_

代码示例:

print('8.数组合并与拆分\n')

print('8.1.面向列的合并,np.hstack,np.column_stack,np.c_')
print('当合并的是一维数组时,\n np.column_stack和np.c_会把数组先转化为二维的列向量再进行合并')
print('而二维以上数组的合并时,这三个是等价的')
arr5=np.array([1,2,3])
arr6=np.array([4,5,6])
print(np.hstack((arr5,arr6)))
print(np.column_stack((arr5,arr6)))
print(np.c_[arr5,arr6])

运行结果:


8.2.面向行的合并,np.vstack,np.concatenate

代码示例:

print('8.2.面向行的合并,np.vstack,np.concatenate')
print(np.concatenate([arr5,arr6]))
print(np.vstack((arr5,arr6)))

运行结果:


8.3.np.c_还可以把数字合并到数组中,也可以把切片翻译成数组后合并

代码示例:

print('8.3.np.c_还可以把数字合并到数组中,也可以把切片翻译成数组后合并')
print(np.c_[[[1,2,3]],0,0,[[4,5,6]]])
print(np.c_[1:3,-2:0])

运行结果:


8.4.数组的拆分,split

代码示例:

print('8.4.数组的拆分,split')
arr7=np.c_[arr5,arr6]
one,two,three=np.split(arr7,[1,2],axis=0)
print(arr7)
print(one,two,three)

运行结果:


9.线性代数运算

代码示例:

print('9.线性代数运算')
print('二维数组可以当做矩阵')
arr8 = np.array([[1, 2], [3, 4]])
print(arr8)

print('转置T\n',arr8.T)

print('矩阵乘法np.dot')
A=np.dot(arr8,arr8.T)
print(A)

print('np.linalg.inv计算方阵的逆\n',np.linalg.inv(A))
print('np.linalg.det计算行列式\n',np.linalg.det(A))
print('np.linalg.eig计算特征值和特征向量\n',np.linalg.eig(A))
print('np.trace计算迹\n',np.trace(A))
print('np.linalg.qr计算QR分解\n',np.linalg.qr(A))
print('np.linalg.svd计算奇异值分解\n',np.linalg.svd(A))

b=np.array([[5], [7]])
print('np.linalg.solve解Ax=b\n',np.linalg.solve(A,b))

运行结果:


三.全部代码
import numpy as np 

'''1.创建ndarray的几种方式'''
print('1.创建ndarray的几种方式')

a=np.array([[1,2,3,4],[2,4,6,8]],dtype=np.float64)
print('np.array(list or tuple),dtype用于设置数据类型')
print(a)

b=np.arange(1,21,2).reshape(2, 5)
print('np.arange类似于range,reshape用于设置数组维数及形状')
print(b)

c=np.zeros((2,3,4))
print('np.zeros创建全0数组,类似的还有np.ones,np.empty,np.ones_like(a)')
print(c)

d=np.linspace(1,19,10)
print('np.linspace(1,19,10)创建1到19之间取10个数的一维数组')
print(d)

e=np.random.randn(5, 4)
print('np.random类型创建随机数组')
print(e)

'''2.改变数组的数据类型、形状和维数,注意数组本身并没有变化'''
print('2.改变数组的数据类型、形状和维数,注意数组本身并没有变化')

a1=a.astype(np.int32)#数据变为4字节整数类型
a2=a1.reshape(4,-1)#由2行4列变为4行2列,这里-1改为2是一样
a3=a2[np.newaxis,:]#二维变成三维,跟a2.reshape(1,4,2)等价
a4=a3.ravel('F')#按照列优先的顺序变成一维的,没有'F'则默认行优先
a5=a.T#转置
print('a\n',a)
print('a1\n',a1)
print('a2\n',a2)
print('a3\n',a3)
print('a4\n',a4)
print('a5\n',a5)

'''3.基本数组统计方法'''
print('3.基本数组统计方法')

print('a1\n',a1)
print('a1的最小值\n',a1.min())
print('a1的最大值\n',a1.max())
print('a1的平均值\n',a1.mean())
print('a1的标准差\n',a1.std())
print('a1的方差\n',a1.var())
print('只对轴0,即每列上的数求和\n',a1.sum(0))
print('累积,cumprod(),默认行优先\n',a1.cumprod())
print('累和,cumsum(1)求轴1,即每行上的数的累计和\n',a1.cumsum(1))

'''4.常见的元素级函数'''
'''4.1.一元函数'''
print('4.常见元素级函数')
print('4.1.一元函数')

arr = np.random.randint(-2,3,size=(2,4))
#创建了一个二维数组,数据是-2到2之间的随机整数
print(arr)
print('np.abs求绝对值\n',np.abs(arr))
print('np.sin求正弦\n',np.sin(arr))#类似的有sinh,arcsin,cos,tan
print('np.square平方后再开方np.sqrt\n',np.sqrt(np.square(arr)))
print('e的x次方\n',np.exp(arr))#log用于求lnx
print('np.isnan哪些值是NaN(不是数字)\n',np.isnan(arr))
remainder, whole_part = np.modf(arr)#小数和整数部分形成两个独立的数组
np.sign(arr)#arr中的元素根据正负性改为1、-1或0

'''4.2.二元函数,数组必须具有相同shape'''
print('4.2.二元函数,数组必须具有相同shape')

f=np.arange(1,7).reshape(2,3)
g=np.ones_like(f)*2
print('f\n',f)
print('g\n',g)
print('f+g,np.add\n',np.add(f,g))
print('f-g,np.subtract\n',np.subtract(f,g))
print('f*g,np.multiply\n',np.multiply(f,g))
print('f/g,np.divide\n',np.divide(f,g))
print('f/g,取整数部分\n',np.floor_divide(f,g))
print('f/g的余数,np.floor_divide\n',np.mod(f,g))
print('f的g次方,np.power\n',np.power(f,g))
print('比较f和g,取较大的数np.maximum\n',np.maximum(f,g))#较小数minimum

'''4.3.若数组没有相同的形状,则是广播运算,但也必须有一条轴的形状一样'''
print('4.3.若数组没有相同的形状,则是广播运算,但也必须有一条轴的形状一样')

#现在计算每个数减去所在列(轴0)的平均值'
print('f是2行3列,shape是(2,3)\n',f)
h=f.mean(0)#计算每一列的平均值
print('h是一维的,有3列,shape是(3,)\n',h)
print('f与h列数相同,可以直接用f-h\n',f-h)

#下面计算每个数减去所在行(轴1)的平均值
i=f.mean(1)#计算每一行的平均值
print('i是一维的,有2列,shape是(2,)\n',i)
print('i需要先转换成2行的形状,跟f的相同才能计算\n',i.reshape(2,1))
print('f-i.reshape(2,1)\n',f-i.reshape(2,1))

'''5.排序,sort默认对行上的元素排序'''
print('5.排序sort,默认对行上的元素排序')

arr1 = np.random.randint(1,50,size=(2, 5))
print(arr1)
print('对列上的元素排序,np.sort返回的是一个视图\n',np.sort(arr1,axis=0))
arr2=arr1.copy()
arr2.sort(0)
print('直接调用sort函数时是直接修改数组\n',arr2)

print('下面这个例子对数据排序后取出了它的10%分位数')
large_arr =np.random.permutation(1000)#1000个随机数
large_arr.sort()
print(large_arr[int(0.01 * len(large_arr))]) # 10% quantile

'''6.将条件逻辑表述为数组运算,np.where'''
print('6.将条件逻辑表述为数组运算,np.where')

print('这个例子把小于0的数字改成0')
arr3 = np.random.randn(2,4)
print(np.where(arr3<0,0,arr3))

print('这个例子取出两组数据中较大的数')
x=np.array([5,2,6,5,7])
y=np.array([3,7,9,5,5])
result=np.where(x>=y,x,y)
print(result)
#可以直接使用np.maximum(x,y)

'''7.重复操作,repeat和tile'''
print('7.重复操作,repeat和tile')
print('repeat是对元素的重复操作,而tile是对整个数组的重复操作')
arr4=np.arange(1,9).reshape(2,4)
print('arr4\n',arr4)

print('arr4.repeat或np.repeat(arr4,),([2,3],axis=0)表示第一行重复一次,第二行重复2次')
print(arr4.repeat([2,3],axis=0))

print('只能用np.tile(arr4,),([2,3])表示在轴0上重复一次,在轴1 上重复2次')
print(np.tile(arr4,[2,3]))

'''8.数组合并与拆分'''
print('8.数组合并与拆分\n')

print('8.1.面向列的合并,np.hstack,np.column_stack,np.c_')
print('当合并的是一维数组时,\n np.column_stack和np.c_会把数组先转化为二维的列向量再进行合并')
print('而二维以上数组的合并时,这三个是等价的')
arr5=np.array([1,2,3])
arr6=np.array([4,5,6])
print(np.hstack((arr5,arr6)))
print(np.column_stack((arr5,arr6)))
print(np.c_[arr5,arr6])

print('8.2.面向行的合并,np.vstack,np.concatenate')
print(np.concatenate([arr5,arr6]))
print(np.vstack((arr5,arr6)))

print('8.3.np.c_还可以把数字合并到数组中,也可以把切片翻译成数组后合并')
print(np.c_[[[1,2,3]],0,0,[[4,5,6]]])
print(np.c_[1:3,-2:0])

print('8.4.数组的拆分,split')
arr7=np.c_[arr5,arr6]
one,two,three=np.split(arr7,[1,2],axis=0)
print(arr7)
print(one,two,three)

'''9.线性代数运算'''
print('9.线性代数运算')
print('二维数组可以当做矩阵')
arr8 = np.array([[1, 2], [3, 4]])
print(arr8)

print('转置T\n',arr8.T)

print('矩阵乘法np.dot')
A=np.dot(arr8,arr8.T)
print(A)

print('np.linalg.inv计算方阵的逆\n',np.linalg.inv(A))
print('np.linalg.det计算行列式\n',np.linalg.det(A))
print('np.linalg.eig计算特征值和特征向量\n',np.linalg.eig(A))
print('np.trace计算迹\n',np.trace(A))
print('np.linalg.qr计算QR分解\n',np.linalg.qr(A))
print('np.linalg.svd计算奇异值分解\n',np.linalg.svd(A))

b=np.array([[5], [7]])
print('np.linalg.solve解Ax=b\n',np.linalg.solve(A,b))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值