Numpy 使用入门
为什么要使用Numpy
numpy是采用c语言编写的数据分析模块,消耗资源少、采用的是矩阵运算,比python自带的字典或者列表快很多。
Numpy应该怎么安装呢
一般通过命令行即可安装:
sudo pip3 install numpy(采用python3版本)
sudo pip install numpy(采用python2版本)
Numpy基本属性
ndim、shape、size
首先要在python中导入numpy模块
>>> import numpy as np(一般都简称为np)
并赋值一个列表,并且转化为矩阵:
>>> a = np.array([[1,2,3],[2,3,4]])
>>> print(a)
“””
array([[1, 2, 3],
[2, 3, 4]])
“””
>>> print(‘number of the dim: ’, a.ndim)
#number of the dim: 2
>>> print(‘shape: ’, a.shape)
#shape: (2,3)
>>> print(‘size: ’, a.size)
#size: 6
Numpy创建array的方法
首先,创建array可以采用常规的方法:
a = np.array([2,23,4])
print (a)
#[2,23,4]
此时,创建出来的一维矩阵中数据的类型为int型,如果需要浮点型则需要单独设置dtype值:
>>> a = np.array([2,23,4], dtype = np.int)
>>> print (a.dtype)
#int 64
>>> a = np.array([2,23,4], dtype = np.int32)
>>> print (a.dtype)
#int 32
>>> a = np.array([2,23,4], dtype = np.float)
>>> print (a.dtype)
#float 64
>>> a = np.array([2,23,4], dtype = np.float32)
>>> print (a.dtype)
#float 32
如果需要创建一些特定的矩阵,则可以采用一些指定api:
创建全0数组:
>>> a = np.zeors((3,4))
“””
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
“””
创建全1数组,同时也能指定这些数据的dtype:
>>> a = np.ones((3,4), dtype = np.int)
“””
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
“””
创建全空数组,其实每一个值并不是空,只是接近于0:
>>> a = np.empty((3,4))
“””
array([[ 0.00000000e+000, 4.94065646e-324, 9.88131292e-324,
1.48219694e-323],
[ 1.97626258e-323, 2.47032823e-323, 2.96439388e-323,
3.45845952e-323],
[ 3.95252517e-323, 4.44659081e-323, 4.94065646e-323,
5.43472210e-323]])
“””
创建连续数组用arrange:
>>> a = np.arrange(10,20,2) #10 到19 的数据,俩步长
#array([10, 12, 14, 16, 18])
使用reshape改变数据形状:
>>> a = np.arrange(12).reshape((3,4))
“””
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
“””
用linspace创建线段型数据:
>>> a = np.linspace(1,10,20) #开始为1,结束为10,分为20个段,生成数据
“””
array([ 1. , 1.47368421, 1.94736842, 2.42105263,
2.89473684, 3.36842105, 3.84210526, 4.31578947,
4.78947368, 5.26315789, 5.73684211, 6.21052632,
6.68421053, 7.15789474, 7.63157895, 8.10526316,
8.57894737, 9.05263158, 9.52631579, 10. ])
“””
并且还能继续进行reshape工作:
>>> a = np.linspace(1,10,20).reshape((5,4))#修改shape
"""
array([[ 1. , 1.47368421, 1.94736842, 2.42105263],
[ 2.89473684, 3.36842105, 3.84210526, 4.31578947],
[ 4.78947368, 5.26315789, 5.73684211, 6.21052632],
[ 6.68421053, 7.15789474, 7.63157895, 8.10526316],
[ 8.57894737, 9.05263158, 9.52631579, 10. ]])
"""
Numpy的基本运算
举个例子:
>>> 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])
而在python中,乘方通常不是用”^”符号表示,而是“**”表示,所以:
>>> c = b**2
#array([0,1,4,9])
不仅如此,在Numpy中有许多数学函数工具,例如sin、cos、tan等:
>>> 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)
若想判断是否等于x,则需要用双等号”==“而不是单等号”=“
如果运算多行多维度矩阵操作:
>>> a = np.array([[1,1],[0,1]])
>>> b = np.arange(4).reshape((2,2))
>>> print(a)
# array([[1, 1],
# [0, 1]])
>>> print(b)
# array([[0, 1],
# [2, 3]])
Numpy中矩阵乘法则分为俩种,第一是之前提到的对应元素相乘,第二是标准的矩阵乘法运算,即对应行乘对应列得到相应元素:
>>> c_dot = np.dot(a,b)
# array([[2, 4],
# [2, 3]])
另一种dot的表示方法:
>>> c_dot_2 = a.dot(b)
# array([[2, 4],
# [2, 3]])
并且,Numpy中还包含了sum()、min()、max()使用:
>>> import numpy as np
>>> a = np.random.random((2,4))
print(a)
# array([[ 0.94692159, 0.20821798, 0.35339414, 0.2805278 ],
# [ 0.04836775, 0.04023552, 0.44091941, 0.21665268]])
np.sum(a) # 4.4043622002745959
np.min(a) # 0.23651223533671784
np.max(a) # 0.90438450240606416
并且还能在括号中添加axis值,axis设置为0,列为查找单元,axis值为1,行为查找单元。
print("a =",a)
# a = [[ 0.23651224 0.41900661 0.84869417 0.46456022]
# [ 0.60771087 0.9043845 0.36603285 0.55746074]]
print("sum =",np.sum(a,axis=1))
# sum = [ 1.96877324 2.43558896]
print("min =",np.min(a,axis=0))
# min = [ 0.23651224 0.41900661 0.36603285 0.46456022]
print("max =",np.max(a,axis=1))
# max = [ 0.84869417 0.9043845 ]
Numpy的索引查找
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
print(np.argmax(A)) # 11
argmin()、argmax()俩个函数分别对应求矩阵中最小元素和最大元素的索引。
如果需要计算均值,则可以用以下俩种方式:
print(np.mean(A)) #7.5
print(np.average(A)) #7.5
print(A.mean()) #7.5
中位数函数:
print(A.median()) #7.5
累加函数:
print(np.cumsum(A))
#[2 5 9 14 20 27 35 44 54 65 77 90]
累差运算函数:
print(np.diff(A))
#[[1,1,1]
#,[1,1,1]
#,[1,1,1]]
nonzero()函数:
<<< print(np.nonzero(A))
#(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]))
第一个数组为不为0的索引第一个坐标,第二个数组同理,组合起来为坐标。
还能排序,用np.sort()
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]])
矩阵转置运算则可以用俩方法:
<<< 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()函数格式为clip(Array, Array_min, Array_max)
让矩阵中有比最小值小或者比最大值大的元素,转换为最小值或者最大值。
Numpy的索引
一维索引:
<<< 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]
此时A[2]就为A中第三行的所有元素。
二维索引:
<<< print(A[1][1]) #8
<<< print(A[1,1]) #8
<<< print(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行的数列,而flat是一个迭代器,本身是一个object属性:
<<< import numpy as np
<<< A = np.arange(3,15).reshape((3,4))
<<< print(A.flatten())
# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
<<< for item in A.flat:
<<< print(item)
# 3
# 4
……
# 14
Numpy中,array的合并
np.vstack()
<<< 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]]
"""
vertical stack 属于一种上下合并,对括号中的俩个整体进行对应操作。探索一下属性可以发现:
<<< C = np.vstack((A,B))
<<< print(A.shape,C.shape)
#(3,)(2,3)
np.hstack()
<<< D = np.hstack((A,B)) # horizontal stack
<<< print(D)
# [1,1,1,2,2,2]
<<< print(A.shape,D.shape)
# (3,) (6,)
通过结果可以看出,D本身来源A,B俩个数列的左右合并。
np.newaxis()增加维度:
<<< 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)
这样便将有三个元素的array转换成了1*3或者3*1的矩阵了。
np.concatenate()
<<< C = np.concatenate((A,B,B,A),axis=0)
<<< 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]])
"""
控制axis的值来选择横向或者纵向打印。
Numpy array分割
<<< 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))
"""
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
"""
被纵向分割为俩个array放在一个列表中。
<<< print(np.split(A, 3, axis=0))
# [array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
为横向分割.
因为例子的array只有4列,所以只能等量分割,因此如果输入分割为3份就会报错:
<<< 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]])]
"""
并且,vsplit()与hsplit()也是可以使用。同vstack()与hstack():
<<< 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]])]
"""
Numpy 中的copy与deep copy
简单等号”=“会使得元素之间带有关联性:
<<< import numpy as np
<<< a = np.arange(4)
# array([0, 1, 2, 3])
<<< b = a
<<< c = a
<<< d = b
此时,不论改变a、b、c、d,都会同时改变所有元素,因为所有元素都是指向同一个地址。
<<< b is a # True
<<< c is a # True
<<< d is a # True
而如果想要取消这种类似指针的关联性,需要使用函数.copy():
<<< 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])
此时,则没有了关联性。