ml Numpy(科学计算库)学习笔记

numpy

NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
用    途
存储和处理大型矩阵
一个用python实现的科学计算包。
包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
mport numpy
a = numpy.genfromtxt("world_alcohol.txt",delimiter=',',dtype=str)
print(a)

会以列表的形式打印一个<class 'numpy.ndarray'>类型的矩阵

b = numpy.array([1,23,3])
print(b.shape)

会建立一个数组,打印结果:

 如果是二维数组,打印(x,x)

numpy.array里面必须存储相同的数据结构
如果类型不同,会变成同一类型
要取二维数组数据:a[1,4]取的是第二行第五列的值
切片与列表类同

a = numpy.array([[1,2,3],[2,3,4],[3,4,5]])
b = a[:,2]
print(b)

输出:[3 4 5]

输入:

a = numpy.array([[1,2,3],[2,3,4],[3,4,5]])
print(a == 3)

 输出:(对比)

[[False False  True]
 [False  True False]
 [ True False False]]

 输入:

a = numpy.array([[1,2,3],[2,3,4],[3,4,5]])
b = (a == 3)
print(a[b])

输出:(由布尔类型做索引返回值)

[3 3 3]

利用上面的知识可以实现的操作:

由已知值与目标值做对比并输出与目标值相同的那一行:

a = numpy.array([[1,2,3],[2,3,90],[3,4,5]])
b = (a[:,2] == 90)
print(b)
print(a[b,:])

结果:

[False  True False]
[[ 2  3 90]]

 进行与运算:

a = numpy.array([[1,2,3],[2,3,90],[3,4,5]])
b = (a == 1) & (a == 3)
print(b)

输出:

[[False False False]
 [False False False]
 [False False False]]

进行或运算:

a = numpy.array([[1,2,3],[2,3,90],[3,4,5]])
b = (a == 1) | (a == 3)
print(b)

输出:

[[ True False  True]
 [False  True False]
 [ True False False]]

改变数组类型:

a = numpy.array(['1','2','3'])
print(a.dtype)
print(a)
a = a.astype(float)
print(a.dtype)
print(a)

输出:

<U1
['1' '2' '3']
float64
[1. 2. 3.]

可以利用a.min()查看最小值,查看方法可用:

print(help(numpy.array))

 对行进行求和:

a = numpy.array([[1,2,3],[2,3,4],[3,4,5]])
print(a.sum(axis=1))

输出:

[ 6  9 12]

列求和:

a = numpy.array([[1,2,3],[2,3,4],[3,4,5]])
print(a.sum(axis=0))

输出:

[ 6  9 12]

常用函数

arange与建立二维数组:

import numpy as np
print(np.arange(15))
a = np.arange(15).reshape(3,5)
print(a)

输出:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]

查看矩阵属性:

import numpy as np
a = np.arange(15).reshape(3,5)
print(a.shape)   #行列
print(a.ndim)     #多少维
print(a.dtype.name)    #数据类型
print(a.size)    #多少个数据

输出:

(3, 5)
2
int32
15

初始化一个矩阵:

import numpy as np
a = np.zeros((3,4))
print(a)

输出:

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]

要将矩阵弄成为一的且设置数据类型:

import numpy as np
a = np.ones((3,4),dtype=np.int32)
print(a)

输出:

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

和python一样输出等差数列:

import numpy as np
a = np.arange(10,30,5)
print(a)

输出:

[10 15 20 25]

创建二维数组随机矩阵:(导入random模块)

import numpy as np
a = np.random.random((3,3))
print(a)

输出:

[[0.25335234 0.63106732 0.05470802]
 [0.38754385 0.24498358 0.06055361]
 [0.26716343 0.62496362 0.87742995]]

等差数组:

import numpy as np
from numpy import pi
a = np.linspace(0,2*pi,100)
print(a)

输出:

[0.         0.06346652 0.12693304 0.19039955 0.25386607 0.31733259
 0.38079911 0.44426563 0.50773215 0.57119866 0.63466518 0.6981317
 0.76159822 0.82506474 0.88853126 0.95199777 1.01546429 1.07893081
 1.14239733 1.20586385 1.26933037 1.33279688 1.3962634  1.45972992
 1.52319644 1.58666296 1.65012947 1.71359599 1.77706251 1.84052903
 1.90399555 1.96746207 2.03092858 2.0943951  2.15786162 2.22132814
 2.28479466 2.34826118 2.41172769 2.47519421 2.53866073 2.60212725
 2.66559377 2.72906028 2.7925268  2.85599332 2.91945984 2.98292636
 3.04639288 3.10985939 3.17332591 3.23679243 3.30025895 3.36372547
 3.42719199 3.4906585  3.55412502 3.61759154 3.68105806 3.74452458
 3.8079911  3.87145761 3.93492413 3.99839065 4.06185717 4.12532369
 4.1887902  4.25225672 4.31572324 4.37918976 4.44265628 4.5061228
 4.56958931 4.63305583 4.69652235 4.75998887 4.82345539 4.88692191
 4.95038842 5.01385494 5.07732146 5.14078798 5.2042545  5.26772102
 5.33118753 5.39465405 5.45812057 5.52158709 5.58505361 5.64852012
 5.71198664 5.77545316 5.83891968 5.9023862  5.96585272 6.02931923
 6.09278575 6.15625227 6.21971879 6.28318531]
View Code

乘法运算:

import numpy as np
a = np.array([[1,2,],[0,3]])
b = np.array([[0,3],[2,1]])
print(a*b)   #对应位置相乘
print(a.dot(b))   ##矩阵的乘法1
print(np.dot(a,b))   ##矩阵的乘法2

输出:

[[0 6]
 [0 3]]
[[4 5]
 [6 3]]
[[4 5]
 [6 3]]

 对于矩阵的操作

import numpy as np
a =np.floor(10*np.random.random((3,4)))   #floor表示向下取整  10*为了让取值范围由0-1到0-10
print(a)

输出:

[[5. 4. 8. 1.]
 [1. 2. 1. 8.]
 [2. 3. 3. 0.]]

矩阵、向量之间的转换及求一个矩阵的转置:

import numpy as np
a =np.floor(10*np.random.random((3,4)))   #floor表示向下取整  10*为了让取值范围由0-1到0-10
print(a.ravel())    #变成向量
a.shape = (6,2)      #变成矩阵
print(a)
print('--------------')
print(a.T)        #求矩阵的转置

输出:

[5. 2. 9. 9. 1. 2. 3. 8. 7. 5. 4. 1.]
[[5. 2.]
 [9. 9.]
 [1. 2.]
 [3. 8.]
 [7. 5.]
 [4. 1.]]
--------------
[[5. 9. 1. 3. 7. 4.]
 [2. 9. 2. 8. 5. 1.]]

矩阵的拼接:(让一组数据的特征增加)

import numpy as np
a = np.array([[1,2,],[0,3]])
b = np.array([[0,3],[2,1]])
print(a)
print(b)
print(np.hstack((a,b)))   #竖着是np.vstack((a,b))

输出:

[[1 2]
 [0 3]]
[[0 3]
 [2 1]]
[[1 2 0 3]
 [0 3 2 1]]

矩阵的切分:

import numpy as np
a = np.floor(10*np.random.random((2,12)))
print(np.hsplit(a,3))     #横着切割为三份
print("------------------")
print(np.hsplit(a,(3,4)))
b = np.floor(10*np.random.random((2,12)))
print(np.vsplit(b.T,2))     #竖着切成两份

输出:

[array([[1., 0., 4., 6.],
       [3., 3., 1., 6.]]), array([[1., 4., 0., 6.],
       [1., 4., 1., 2.]]), array([[0., 5., 7., 0.],
       [9., 1., 3., 8.]])]
------------------
[array([[1., 0., 4.],
       [3., 3., 1.]]), array([[6.],
       [6.]]), array([[1., 4., 0., 6., 0., 5., 7., 0.],
       [1., 4., 1., 2., 9., 1., 3., 8.]])]
[array([[3., 0.],
       [6., 5.],
       [2., 3.],
       [9., 0.],
       [5., 8.],
       [3., 6.]]), array([[1., 1.],
       [8., 8.],
       [4., 5.],
       [9., 3.],
       [6., 8.],
       [8., 0.]])]
View Code

 numpy的深浅拷贝

a = np.arange(12)
b = a
# a and b are two names for the same ndarray object
b is a
b.shape = 3,4
print a.shape
print id(a)
print id(b)
View Code

结果显示a,b的id是相同的

浅拷贝:

c = a.view()
c is a
c.shape = 2,6
#print a.shape
c[0,4] = 1234
a

深拷贝:

d = a.copy() 
d is a
d[0,0] = 9999
print d 
print a

输出矩阵最大值:

import numpy as np
data = np.sin(np.arange(20)).reshape(5,4)
print(data)
ind = data.argmax(axis=0)
print(ind)
data_max = data[ind, range(data.shape[1])]
print(data_max)

输出:

[[ 0.          0.84147098  0.90929743  0.14112001]
 [-0.7568025  -0.95892427 -0.2794155   0.6569866 ]
 [ 0.98935825  0.41211849 -0.54402111 -0.99999021]
 [-0.53657292  0.42016704  0.99060736  0.65028784]
 [-0.28790332 -0.96139749 -0.75098725  0.14987721]]
[2 0 3 1]
[0.98935825 0.84147098 0.99060736 0.6569866 ]

ind表示每一列最大值的索引值

扩展一个矩阵:

a = np.arange(0, 40, 10)
b = np.tile(a, (3, 5)) 
print(b)

输出:

[[ 0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30]
 [ 0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30]
 [ 0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30  0 10 20 30]]

对矩阵由小到大排序1:

import numpy as np
a = np.array([[4, 3, 5], [1, 2, 1]])
print(a)
b = np.sort(a,axis=1)
print(b)
a.sort(axis=1)
print(a)

输出:

[[4 3 5]
 [1 2 1]]
[[3 4 5]
 [1 1 2]]
[[3 4 5]
 [1 1 2]]

对矩阵由小到大排序2:

import numpy as np
a = np.array([4, 3, 1, 2])
j = np.argsort(a)
print(j)
print(a[j])

输出:

[2 3 1 0]
[1 2 3 4]

 

 

 

 
posted @ 2018-07-21 15:40  ivanthor  阅读(178)  评论(0)    收藏  举报