Numpy入门笔记

Numpy入门笔记

此篇博文为课堂笔记整理而得,逻辑性与系统性稍差,欢迎各位提出意见与疑问。


import numpy as np

数组的表示

  (16,)  长度为16的一维数组

(2,8)表示一个2×8的二维数组,

(2,2,4)表示2×2×4的三维数组。

 数组类型为ndarray,所有元素必须是相同类型

  属性:ndim:表示数组维数

            Shape:各维度大小

            dtype:数据类型

                       

 

常用构建数组的函数

eg:创建一个3*4数组

import numpy as np
L = [[1,2,3,4],[4,5,6,7],[7,8,9,10]]
a = np.array(L)

 

linspace()

numpy.linspace(start, stop, num=50, endpoint=True,retstep=False, dtype=None)

产生等差数列的数组,默认左闭右闭,endpoint = false则右开

在start和stop之间(一定有start和stop)随机产生num数量的数(默认为50个)

import numpy as np
a = np.linspace(1,10,10)
print (a)
>>>[  1.   2.   3.   4.   5.   6.   7.   8.   9.  10.]
import numpy as np
a = np.linspace(1,10,10,endpoint=False)
print (a)

arange()

用法与range相同,只不过是产生一个数组元素。数值类型为int

import numpy as np
a = np.arange(1,10)
print (a)
>>>[1 2 3 4 5 6 7 8 9]

生成随机数数组

numpy.random.rand(a,b):从0~1中随机生成数字,返回一个a行b列的二维数组

numpy.random.randint(1,100,10): 生成随机数(起始,结束,步长)

函数

解释

示例

rand(d0,d1,…dn)

产生0到1之间随机数(浮点数)组成的数组,数组形状为(d0,d1,…dn),表示每一维的长度。

>>> np.random.rand(5)

array([ 0.33,  0.21,  0.46,  0.91,  0.30])

randn(d0,d1,…dn)

产生标准正态分布随机数(浮点数)组成的数组,数组形状为(d0,d1,…dn),表示每一维的长度。

>>> np.random.rand(5)

array([ 0.13,  0.40,  0.83,  0.42,  0.42])

randint(low[,hige,size,dtype])

产生最小值为low,最大值小于high,长度为size的随机数组成的一维数组。

>>> np.random.randint(1,10,5)

array([9, 2, 6, 9, 3])

normal(loc,scale,size)

产生正态(高斯)分布的样本数组,loc为均值,scale为标准偏差,size为数组长度。

>>> np.random.normal(0,1,5)

array([-1.66,  0.23, -0.03,  0.19,  0.55])

 

 

创建结构数组

结构类型通过字典来定义。字典有两个键“ names” 和“formats” ,键的值都是序列,分别对应结构中每个值的名称(类似于字段名)和值的类型(类似于字段类型)

#(由于结构中每个元素的大小必须固定,因此需要指定字符串的长度。)
import numpy as np
s_dict ={"names":["name","age","weight"],"formats":["S32","i","f"]}
students =[("zhang",22,75.5),("wang",24,65.5)]
a = np.array(students,dtype=s_dict)
print (a)
>>>[(b'zhang', 22, 75.5) (b'wang',24, 65.5)]


改变数组形状

Shape属性可以改变,但是size(里面元素总个数)应该保持一致。可以是改变维数,如2维变成1维;也可以维度不变,只改变每一维的长度。

可以通过直接改变其形状:a.shape = (3,4)

可以通过返回改变形状的新数组:

reshape()方法,返回指定形状的新数组。Eg: reshape(3,4)

transpose()方法,返回经过转置的新数组。

flatten()方法,返回展平(变成一维)的新数组

 

 

数组合并

vstack()将数组上下合并

hstack()将数组左右合并      

                              

>>>C:[[111]
     [222]]
>>>D:[111222]

Concatenate((A,B,C,D),axis= 0)【axis=0为上下合并,=1为左右合并】


数组分割

np.split(a,2,axis = 1) 

将数组分成两列,axis = 1 为按列分割,返回一个数组列表

(第二个参数也可以是个list:np.split(a,[1,1,2],axis =1)

a = np.arange(12).reshape(3,4)
np.split(a,2,axis = 1) 
>>>[array([[0, 1],
        [4, 5],
        [8, 9]])
,   array([[ 2,  3],
        [ 6,  7],
        [10, 11]])]

np.vsplit(a,3)   np.hsplit(a,4)也可以有同样的效果


数组索引和切片

①[1,1]或[1][1]返回一个二维数组的第二行第二列的元素

②[1,]或[1]返回第二行全部元素

   [:,1]返回第二列全部元素

③[0:2,0:2]返回4个指定位置的元素

 

数组运算

常用函数

函数

解释

abs()

绝对值函数

sqrt()

平方根函数

square()

平方函数

sin()、cos()、tan()

三角函数

arcsin()、arccos()、arctan()

反三角函数

log()、log10()、log2()

分别为底数为e、底数为10、底数为2的log函数

exp()

指数函数

 

比较运算和逻辑运算

数组之间及数组和标量之间可以进行>、>=、<、<=、==、!=等比较运算,运算结果返回的数组是一个布尔型数组,数组中的元素值是True或False

①布尔型数组可以进行&(和)、|(或)^(非)等逻辑运算,返回的也是布尔型数组。

import numpy as np
from math import *
a = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print(a)
b = a > 4
print(b)

>>> [[ 1  2  3  4]
 [ 4  5 6  7]
 [ 7  8  910]]
[[False FalseFalse False]
 [False  True True  True]
 [ True  True True  True]]

②比较运算和逻辑运算也可以作为数组的索引,返回值为True的元素组成的数组。

b = a > 4
print(b)

>>> [ 5  6  7 7  8  9 10]

③同样,对索引进行赋值可以改变数组中对应元素的值。

a[a > 4] = 20
print(a)

>>>[[ 1  2  3  4]
 [ 4 20 20 20]
 [20 20 20 20]]

对数组元素进行判断

where函数

如果要对一个数组按照某个条件表达式进行判断,表达式为True时,取xarr值;表达式为False时,取yarr值,可利用np的where函数,函数形式为:
        np.where(cond(条件语句),xarr(True时取值),yarr(False时取值))
# xarr和yarr可以是数组,也可以标量值。

a = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
print(np.where(a>4,1,0))

>>> [[0 0 0 0]
 [0 1 1 1]
 [1 1 1 1]]


线性代数运算

from numpy import linalg

函数

解释

diag()

以一维数组的形式返回矩阵的对角线元素或将一维数组转换为方阵(非对角线元素为0)

dot()

矩阵相乘

trace()

计算对角线元素的和

det()

计算矩阵行列式

eig()

计算矩阵的特征值和特征向量

inv()

计算矩阵的逆

solve()

解线性方程组

lstsq()

计算最小二乘解

from numpy.linalg import inv
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(inv(a))

>>> [[ 3.15251974e+15 -6.30503948e+15  3.15251974e+15]
 [-6.30503948e+15  1.26100790e+16 -6.30503948e+15]
 [ 3.15251974e+15-6.30503948e+15  3.15251974e+15]]

lstsq()计算最小二乘解

linalg模块中的lstsq(a, b)是利用最小二乘法求解方程组ax =b中的x值,这里a为m×n的二维数组(m为方程数,n为变量数),b是m个元素组成的一维数组,x=x1,x2,…xn

#lstsq(a, b)返回一个表列,元组中四个元素,第一元素表示所求的最小二乘解,第二个元素表示残差总和,第三个元素表示X1矩阵秩,第四个元素表示X1的奇异值

>>>(array([ 1.  , -0.95]), array([0.05]), 2,array([4.10003045, 1.09075677]))

如果方程组有常数项,如ax+c = b,可以改写成[a 1][xc]T = b,输入参数a变成[a 1],返回的x是n+1个元素组成的一维数组,最后一个元素为c值(奇异值)。


数组统计

函数

说明

sum()

对数组中全部或某轴向的元素求和。零长度数组的sum为0。

mean()

算术平均值。零长度数组的mean为NaN。

std()、var()

标准差和方差,自由度可调(默认为n)。

max()、min()

最大值和最小值。

argmax()、argmin()

最大值和最小值元素的索引。

cumsum()、cumprod()

所有元素的累计和累计积。

bincount()

用于对数组中各个元素出现的次数进行统计,要求数组为一维的非负整型数组,返回一维数组,记录每个元素值的出现次数,数组的长度是最大元素值加1。

histogram()

用于对一维数组进行直方图统计。

Sum()  

a =np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])

print(np.sum(a))              #全部求和
print(np.sum(a,axis=0))                    #axis=0对列求和  
print(np.sum(a,axis=1))                        #axis=1对行求和

>>> 66
[12 15 18 21]
[10 22 34]

Bincount()

a = np.array([0, 1, 1, 3, 2, 1, 7])
print(np.bincount(a))

>>> [1 3 1 1 0 0 0 1]  #输出结果长度为原数组最大值加1,索引即为原数组值


数组元素排序

①ndarray.sort(axis=-1,kind='quicksort',order=None)直接改变数组内容进行排序

numpy.sort(a,axis=-1,kind='quicksort',order=None)返回一个排序后的数组

axis:排序沿着数组的方向,0表示按行,1表示按列

kind:排序的算法,提供了快排、混排、堆排

order:不是指的顺序,以后用的时候再去分析这个

unique(),用于返回数组中所有不同的值,并按从小到大的顺序排列权重

a =np.array([3,3,3,2,2,1,1,4,4])
b =np.unique(a)
print(b)

>>>[1 2 3 4]

 

 

 

 

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页