(未完)
采用矩阵运算,运算速度快,占用资源少,比python自带的字典或者列表要快很多;numpy是采用C语言编写的,而pandas又是基于numpy编写的升级版。
sudo apt-get install python-numpy
sudo apt-get install python-pandas
array 数组:可生成数组或矩阵
ndim
shape
size
import numpy as np
array = np.array([[1,2,3],[4,5,6]])
print(array)
print(array.ndim) #维度dimenion:几维 2
print(array.shape) #形状:行数和列数 (2,3)
print(array.size) #元素个数 6
array
dtype
zeros
ones
empty
arange
linspace
import numpy as np
a = np.array([[1,2,3],
[4,5,6]])
print(a)
a = np.array([[1,2,3],[4,5,6]],dtype=np.int) #制定数据的类型 对于array,是dtype,而numpy的常用数据类型有两种:int和float,一般有int16 int32 int64,float同样,数值越大占用内存越大,精度也就越高,但是单位内存下存储的东西也就越少
print(a.dtype) #python3.5及以下版本默认类型为64,python3.6默认为32
a = np.zeros((3,4)) #生成3行4列元素全为0的矩阵
print(a)
a = np.ones((3,4),dtpye = np.float32) #生成3行4列元素全为1的矩阵,并规定数据类型为float32
print(a)
print(a.dtype)
a = np.empty((3,4)) #生成3行4列且每个元素都接近0的矩阵,据说在python3.6中和zeros是一样的了,未查证
print(a)
#生成等差数列的两个方法:
a = np.arange(10,20,2) #生成连续的数组,从10到20(不包括20),**步长为2**
print(a)
a = np.linspace(10,20,5) #创建线段型数据 从10到20(包括20),**元素个数为5**
print(a)
a = np.linspace(10,20,num=50, endpoint=True, retstep=False, dtype=None)
print(a)
a = np.linspace(1,10,5).reshape((5,4)) #改变矩阵的形状,变为5行4列的矩阵
print(a)
np.arange(start,stop,step)
生成一个[start,stop) 左闭右开步长为step的一维数组。
np.linspace(start,stop,num=40, endpoint=True, retstep=False, dtype=None)
生成一个[start,stop]左右均闭的等差数列,元素个数num默认为50个,endpoint=True默认包含stop, retstep=False默认不显示步长, dtype=None默认不改变数据类型。
import numpy as np
a = np.array([5,2,4,6])
b = np.arange(4) # = np.array([0,1,2,3])
#常规运算
c = a - b #[5,1,2,3]
c = a + b
c = a * b #[0,2,8,18] 对应位置上的元素相乘,并非矩阵乘法
c = a ** 2 #a^2 [25,4,16,36]
c = np.sin(a) #对每个元素求sin
c = 10*np.sin(a)
#逻辑判断,返回一个bool类型的矩阵
print(b<4) #[True,True,True,True]
print(a==2) #[False,True,False,False]
#----------------------------------------------------------------
#上面的运算都是基于一维矩阵/向量/一维数组,现在要对多维矩阵进行运算
a = np.array([[1,1],
[0,1]]) #2行2列的矩阵
b = np.arange(4).reshape((2,2))
c_dot = np.dot(a,b) #矩阵相乘
c_dot_2 = a.dot(b) #两种方法等价
#-------------------------------------------------------------
a = np.random.random((2,4)) #生成一个所有元素都是0到1的2行4列的随机数矩阵
print(a)
# array([[ 0.94692159, 0.20821798, 0.35339414, 0.2805278 ],
# [ 0.04836775, 0.04023552, 0.44091941, 0.21665268]])
np.sum(a) #矩阵中所有元素求和
np.min(a) #矩阵中最小值
np.max(a) #矩阵中最大值
#分别计算每一行或者每一列的运算,用到axis=1,0;其中0表示按列,1表示按行
np.sum(a,axis=1)
# sum = [ 1.96877324 2.43558896]
np.min(a,axis=0)
# min = [ 0.23651224 0.41900661 0.36603285 0.46456022]
np.max(a,axis=1)
# max = [ 0.84869417 0.9043845 ]
argmax : argument of the maximum
import numpy as np
A = np.arange(2,14).reshape((3,4))
# array([[ 2, 3, 4, 5]
# [ 6, 7, 8, 9]
# [10,11,12,13]])
print(np.argmin(A)) #求矩阵中最小元素的索引,第一个元素记为位置0,最后一个元素对应位置为11
# 0
print(np.argmax(A))
# 11
#求平均值 下面四种方法等价:
print(np.mean(A))
print(A.mean())
print(np.median(A))
print(np.average(A))
#7.5
print(np.cumsum(A)) #累加函数,生成的每一项矩阵元素均是从原矩阵首项累加到对应项的元素之和,得到1*12的矩阵
# [2 5 9 14 20 27 35 44 54 65 77 90]
print(np.diff(A)) #累差函数,后一项与此项的差作为这一项的元素,得到3*3的矩阵
# [[1 1 1]
# [1 1 1]
# [1 1 1]]
print(np.nonzero(A)) #查找哪些位置上的元素非0,结果显示成行与列,一一对应
#(array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))
A = np.array([[0,1,2],[6,0,8],[9,5,0]])
print(np.nonzero(A))
#(array([0,0,1,1,2,2]),array([1,2,0,2,0,1])) 见下图
A = np.arange(14,2, -1).reshape((3,4))
# array([[14, 13, 12, 11],
# [10, 9, 8, 7],
# [ 6, 5, 4, 3]])
print(np.sort(A)) #行排序,从小到大
# array([[11,12,13,14]
# [ 7, 8, 9,10]
# [ 3, 4, 5, 6]])
#转置,两种方法等价(A必须是矩阵/一维向量,不能是数组/序列)
print(np.transpose(A))
print(A.T)
# array([[14,10, 6]
# [13, 9, 5]
# [12, 8, 4]
# [11, 7, 3]])
# array([[14,10, 6]
# [13, 9, 5]
# [12, 8, 4]
# [11, 7, 3]])
#clip(array,a,b)函数,其中规定ab的元素全部变为b
print(A)
# array([[14,13,12,11]
# [10, 9, 8, 7]
# [ 6, 5, 4, 3]])
print(np.clip(A,5,9))
# array([[ 9, 9, 9, 9]
# [ 9, 9, 8, 7]
# [ 6, 5, 5, 5]])
在python的数组和列表中,可以使用a[1]这种方式索引,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[0]) #索引第0行
# [3 4 5 6]
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]])
"""
print(A[0][0]) # 3
print(A[0, 0]) # 3
print(A[1, 1:3]) # [8 9] 同python中的切片
#----------------------------------------------
for row in A:
print(row)
"""
[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14] #使用for循环,遍历成行向量
"""
for column in A.T: #转置
print(column)
"""
[ 3, 7, 11]
[ 4, 8, 12]
[ 5, 9, 13]
[ 6, 10, 14] #列向量
"""
import numpy as np
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3, 4, 5, 6]
[ 7, 8, 9, 10]
[11, 12, 13, 14]])
"""
print(A.flatten()) #flatten是展开函数,将多维矩阵按行列顺序展开成1行的数列
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
for item in A.flat: #flat是一个迭代器,本身是一个object属性
print(item)
# 3
# 4
……
# 14
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]]
"""
C = np.vstack((A,B))
print(A.shape,C.shape)
# (3,) (2,3) A是一个数组,C是一个2行3列的矩阵
D = np.hstack((A,B)) # horizontal stack
print(D)
# [1,1,1,2,2,2]
print(A.shape,D.shape)
# (3,) (6,) 都是一维数组/序列
前两节提到的转置操作,前提A必须是个矩阵/向量,但是如果我们生成了一个序列/数组,我们就要使用下面你这种方法了:
print(A[np.newaxis,:]) #冒号在前按列,冒号在后按行
# [[1 1 1]]
print(A[np.newaxis,:].shape)
# (1,3) 是一个矩阵/向量
print(A[:,np.newaxis])
"""
[[1]
[1]
[1]]
"""
print(A[:,np.newaxis].shape)
# (3,1)
举个例子:
import numpy as np
A = np.array([1,1,1])[:,np.newaxis] #使用array生成数组,然后使用newaxis转换成矩阵
B = np.array([2,2,2])[:,np.newaxis]
C = np.vstack((A,B)) # vertical stack
D = np.hstack((A,B)) # horizontal stack
print(D)
"""
[[1 2]
[1 2]
[1 2]]
"""
print(A.shape,D.shape)
# (3,1) (3,2)
C = np.concatenate((A,B,B,A),axis=0) #0按列合并 1按行合并
print(C)
"""
array([[1],
[1],
[1],
[2],
[2],
[2],
[2],
[2],
[2],
[1],
[1],
[1]])
"""
D = np.concatenate((A,B,B,A),axis=1)
print(D)
"""
array([[1, 2, 2, 1],
[1, 2, 2, 1],
[1, 2, 2, 1]])
"""
np.split(A, 2, axis=1) #分成2份,保留行数
np.split(A, 2, axis=0) #保留列数
np.hsplit(A, 3) #保留行数
np.vsplit(A, 3) #保留列数
np.array_split(A, 3, axis=1) #分成3份,保留行数
import numpy as np
A = np.arange(12).reshape((3, 4))
print(A)
"""
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
"""
print(np.split(A, 2, axis=1)) #0保留列数 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.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
print(np.hsplit(A, 2)) #等于 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=1)) #不等量划分会报错
# ValueError: array split does not result in an equal division
#不等量分割
print(np.array_split(A, 3, axis=1))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
"""
import numpy as np
a = np.arange(4)
# array([0, 1, 2, 3])
b = a
c = a
d = b
a[0] = 11 #改变a
print(a)
# array([11, 1, 2, 3])
b is a # True #b c d也会改变
c is a # True
d is a # True
d[1:3] = [22, 33] # array([11, 22, 33, 3])
print(a) # array([11, 22, 33, 3])
print(b) # array([11, 22, 33, 3])
print(c) # array([11, 22, 33, 3])
b = a.copy() # deep copy
print(b) # array([11, 22, 33, 3])
a[3] = 44
print(a) # array([11, 22, 33, 44])
print(b) # array([11, 22, 33, 3]) #b不会随着a的改变而改变