python如何增加numpy模块_Python: numpy模块

numpy 模块内容基于jupyter notebook而来,In [*]以下内容为代码,Out[*]为输出结果;

由于执行顺序不一样,可能会有些数据上下文衔接不上,重点是使用方法。NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。

In [3]:

import numpy as np

# 使用array()来创建一个一维数组

arr = np.array([1,2,3,4,5])

arr

Out[3]:

array([1, 2, 3, 4, 5])

In [6]:

# 使用array()来创建一个多维数组

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

Out[6]:

array([[ 1, 2, 3, 4, 5],

[ 6, 7, 8, 9, 10]])

数组中存储的数据元素类型必须是统一类型

优先级:字符串 > 浮点型 > 整数

In [7]:

np.array([[1,2,3],[4.1,5,6]])

Out[7]:

array([[1. , 2. , 3. ],

[4.1, 5. , 6. ]])

用numpy的routines函数来创建数组:zeros(),ones(),linespace(),arange(),random

In [35]:

np.zeros(5)

Out[35]:

array([0., 0., 0., 0., 0.])

In [36]:

np.ones(shape=(2,3))

Out[36]:

array([[1., 1., 1.],

[1., 1., 1.]])

In [38]:

np.linspace(0,20,num=4)

Out[38]:

array([ 0. , 6.66666667, 13.33333333, 20. ])

In [39]:

np.arange(0,20,step=2)

Out[39]:

array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

In [42]:

# 随机

np.random.randint(0,20,size=(2,3))

Out[42]:

array([[ 7, 19, 17],

[ 8, 3, 14]])

In [46]:

# 固定随机性

# np.random.seed()的作用: 当设置相同的seed时,每次生成的随机数也相同,如果不设置seed,则每次生成的随机数都会不一样

np.random.seed(23)

np.random.randint(0,20,size=(2,3))

Out[46]:

array([[19, 6, 8],

[ 9, 8, 13]])

In [47]:

arr.shape # 形状

Out[47]:

(2, 5)

In [48]:

arr.ndim #维度

Out[48]:

2

In [49]:

arr.size # 返回元素个数

Out[49]:

10

In [53]:

type(arr)

Out[53]:

numpy.ndarray

In [50]:

arr.dtype # 数组元素类型

Out[50]:

dtype('int32')

array(dtype=?):可以设定数据类型

arr.dtype = '?':可以修改数据类型

In [114]:

arr = np.random.randint(0,100,size=(5,7))

arr

Out[114]:

array([[34, 0, 91, 11, 62, 96, 88],

[54, 89, 78, 41, 70, 85, 5],

[ 7, 4, 16, 9, 56, 48, 43],

[62, 70, 31, 2, 0, 15, 32],

[48, 15, 61, 2, 34, 22, 42]])

In [115]:

# 取第2行的数据,下标从0开始计算

arr[2]

Out[115]:

array([ 7, 4, 16, 9, 56, 48, 43])

In [119]:

# 取不连续的多行数据

arr[[1,3,4]]

Out[119]:

array([[54, 89, 78, 41, 70, 85, 5],

[62, 70, 31, 2, 0, 15, 32],

[48, 15, 61, 2, 34, 22, 42]])

In [131]:

# 取某个值

arr[0,4]

Out[131]:

62

In [122]:

# 取不连续的某个值: 取的是(0,1)和(3,2)的2个值

arr[[0,3],[1,2]]

Out[122]:

array([ 0, 31])

In [130]:

# 取第一行,第2到第3列 交叉处的数据

arr[0:1, 1:3]

Out[130]:

array([[ 0, 91]])

In [132]:

# 比较数组小于20,对每个元素比较,返回True/False

arr<20

Out[132]:

array([[False, True, False, True, False, False, False],

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

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

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

[False, True, False, True, False, False, False]])

In [135]:

# 把所有小于20的值都赋值为10

arr[arr<20]=10

arr

Out[135]:

array([[34, 10, 91, 10, 62, 96, 88],

[54, 89, 78, 41, 70, 85, 10],

[10, 10, 10, 10, 56, 48, 43],

[62, 70, 31, 10, 10, 10, 32],

[48, 10, 61, 10, 34, 22, 42]])

In [136]:

# numpy中的三元运算符,小于20的都赋值为0,否则赋值为20

np.where(arr<20, 0, 20)

Out[136]:

array([[20, 0, 20, 0, 20, 20, 20],

[20, 20, 20, 20, 20, 20, 0],

[ 0, 0, 0, 0, 20, 20, 20],

[20, 20, 20, 0, 0, 0, 20],

[20, 0, 20, 0, 20, 20, 20]])

In [139]:

# clip(a,b)把小于a的替换为a,大于b的替换为b

arr.clip(20,90)

Out[139]:

array([[34, 20, 90, 20, 62, 90, 88],

[54, 89, 78, 41, 70, 85, 20],

[20, 20, 20, 20, 56, 48, 43],

[62, 70, 31, 20, 20, 20, 32],

[48, 20, 61, 20, 34, 22, 42]])

In [141]:

# 2个nan是不相等的

print(np.nan == np.nan)

print(np.nan != np.nan)

Out [141]:

False

True

In [147]:

# 使用count_nonzero(arr!=arr)来判断nan的个数

arr = np.array([1.,2.,np.nan,np.nan])

np.count_nonzero(arr!=arr)

Out[147]:

2

In [150]:

# 使用isnan来判断是否为nan

print(np.isnan(arr))

# 把nan赋值为0

arr[np.isnan(arr)] = 0

arr

# nan和任何值计算都是nan

Out[150]:

[False False False False]

array([1., 2., 0., 0.])

In [161]:

a1 = np.random.randint(0,100,size=(2,5))

print(a1)

a2 = np.random.randint(0,100,size=(2,5))

print(a2)

Out [161]:

[[93 21 96 60 67]

[99 60 9 13 81]]

[[35 6 62 71 41]

[47 41 88 52 97]]

In [162]:

# 数组的拼接: 2个数组的shape是一样的才能拼接

# np.vstack((a1, a2)) 竖直拼接

print(np.vstack((a1,a2)))

# np.hstack((a1,a2)) 水平拼接

print(np.hstack((a1,a2)))

Out [162]:

[[93 21 96 60 67]

[99 60 9 13 81]

[35 6 62 71 41]

[47 41 88 52 97]]

[[93 21 96 60 67 35 6 62 71 41]

[99 60 9 13 81 47 41 88 52 97]]

In [57]:

# 切片: 切出数组的前2行

arr[0:2]

Out[57]:

array([[76, 91, 39, 90, 25, 51, 6],

[45, 12, 49, 66, 75, 85, 69]])

In [58]:

# 切片: 切出数组的前2列

arr[:,0:2]

Out[58]:

array([[76, 91],

[45, 12],

[64, 12],

[62, 57],

[36, 65]])

In [59]:

# 切片:切出前两行的前两列

arr[0:2,0:2]

Out[59]:

array([[76, 91],

[45, 12]])

In [64]:

# 每行数据倒序

arr[:,::-1]

Out[64]:

array([[ 6, 51, 25, 90, 39, 91, 76],

[69, 85, 75, 66, 49, 12, 45],

[90, 79, 41, 48, 21, 12, 64],

[15, 39, 59, 33, 19, 57, 62],

[83, 86, 15, 43, 1, 65, 36]])

In [65]:

# 每列数据倒序

arr[::-1]

Out[65]:

array([[36, 65, 1, 43, 15, 86, 83],

[62, 57, 19, 33, 59, 39, 15],

[64, 12, 21, 48, 41, 79, 90],

[45, 12, 49, 66, 75, 85, 69],

[76, 91, 39, 90, 25, 51, 6]])

In [66]:

# 数据翻转

arr[::-1,::-1]

Out[66]:

array([[83, 86, 15, 43, 1, 65, 36],

[15, 39, 59, 33, 19, 57, 62],

[90, 79, 41, 48, 21, 12, 64],

[69, 85, 75, 66, 49, 12, 45],

[ 6, 51, 25, 90, 39, 91, 76]])

In [78]:

# 转置矩阵,行列互换

arr.T

Out[78]:

array([[76, 45, 64, 62, 36],

[91, 12, 12, 57, 65],

[39, 49, 21, 19, 1],

[90, 66, 48, 33, 43],

[25, 75, 41, 59, 15],

[51, 85, 79, 39, 86],

[ 6, 69, 90, 15, 83]])

In [79]:

arr = np.random.randint(0,100,size=(3,4))

arr

Out[79]:

array([[29, 42, 38, 4],

[93, 32, 50, 85],

[27, 33, 91, 95]])

In [72]:

# 将多维数组变成一维数组

arr_1 = arr.reshape((12,))

arr_1

Out[72]:

array([ 1, 41, 26, 37, 41, 56, 39, 81, 32, 53, 35, 23])

In [112]:

# 用flatten将多维数组变成一维数组

arr.flatten()

Out[112]:

array([29, 42, 38, 4, 93, 32, 50, 85, 27, 33, 91, 95])

In [73]:

# 1维变2维

arr_1.reshape((2,6))

Out[73]:

array([[ 1, 41, 26, 37, 41, 56],

[39, 81, 32, 53, 35, 23]])

In [80]:

# 级联操作 - 将多个numpy数组进行横向或者纵向的拼接

np.concatenate((arr,arr),axis=0) # axis=0表示列方向

Out[80]:

array([[29, 42, 38, 4],

[93, 32, 50, 85],

[27, 33, 91, 95],

[29, 42, 38, 4],

[93, 32, 50, 85],

[27, 33, 91, 95]])

In [81]:

np.concatenate((arr,arr),axis=1) # axis=1表示行方向

Out[81]:

array([[29, 42, 38, 4, 29, 42, 38, 4],

[93, 32, 50, 85, 93, 32, 50, 85],

[27, 33, 91, 95, 27, 33, 91, 95]])

In [82]:

# 聚合操作 sum

arr.sum(axis=1)

Out[82]:

array([113, 260, 246])

In [85]:

# max

arr.max(axis=0)

Out[85]:

array([93, 42, 91, 95])

In [86]:

# min

arr.min(axis=1)

Out[86]:

array([ 4, 32, 27])

In [87]:

# mean

arr.mean(axis=0)

Out[87]:

array([49.66666667, 35.66666667, 59.66666667, 61.33333333])

In [88]:

# 数学函数 sin(),cos(),tan()

np.sin(arr)

Out[88]:

array([[-0.66363388, -0.91652155, 0.29636858, -0.7568025 ],

[-0.94828214, 0.55142668, -0.26237485, -0.17607562],

[ 0.95637593, 0.99991186, 0.10598751, 0.68326171]])

In [92]:

# numpy.around(a,decimals) 函数返回指定数字的四舍五入值

# a: 数组

# decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置

np.around(arr,decimals=-1)

Out[92]:

array([[ 30, 40, 40, 0],

[ 90, 30, 50, 80],

[ 30, 30, 90, 100]])

常用的统计函数

numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。

numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)。

numpy.median() 函数用于计算数组 a 中元素的中位数(中值)

标准差std():标准差是一组数据平均值分散程度的一种度量。

公式:std = sqrt(mean((x - x.mean())**2))

如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。

方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。

In [101]:

a = np.array([22,33,22,34,41,45])

np.amin(a)

Out[101]:

22

In [102]:

np.amax(a)

Out[102]:

45

In [104]:

np.ptp(a)

Out[104]:

23

In [106]:

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

a.std()

Out[106]:

1.118033988749895

In [107]:

a.var()

Out[107]:

1.25

矩阵相乘

numpy.dot(a, b, out=None)

a : ndarray 数组

b : ndarray 数组

第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。

a1 = np.array([[2,1],[4,3]])

a2 = np.array([[1,2],[1,0]])

np.dot(a1,a2)

Out[108]:

array([[3, 4],

[7, 8]])

将外部的一张图片读取加载到numpy数组中

import matplotlib.pyplot as plt

# 将图片数据进行读取,返回的是一个三维数组, 需安装pillow组件

img_arr = plt.imread('./hold.jpg')

# 讲数组中的数据进行图像显示

plt.imshow(img_arr)

# 将数组中的每一个数组元素都减去100

plt.imshow(img_arr-100)

# 将图片进行左右翻转

plt.imshow(img_arr[:,::-1,:])

# 将图片上下翻转

plt.imshow(img_arr[::-1,:,:])

Out[15]:

# 将图片中“心”字裁剪出来

plt.imshow(img_arr[260:360,250:480,:]) # 裁剪时,第一个对应y轴,第二个对应x轴,

# 实现图片的九宫格

arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) # axis=1 表示行

arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0) # axis=0 表示列

plt.imshow(arr_9)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值