numpy特点

您所在的位置:网站首页 numpy的主要用途 numpy特点

numpy特点

2022-06-15 06:00| 来源: 网络整理| 查看: 265

目录:

一、笔记

二、我的自学路线

三、笔记目录

一、笔记

1) numpy 概念

① numpy是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

② numpy是一个运行速度非常快的数学库,主要用于数组计算,包含:1. 一个强大的N维数组对象 ndarry

2. 广播功能函数

3. 整合 C/C++/Fortran 代码的工件

③ Anaconda自带numpy库,纯python开发环境要安装numpy库,用anaconda的原因是因为它自带了大多数我们常用的包了。

④ numpy最重要的一个特点是其N维"数组"对象ndarry,它是一系列 "同类型数据" 的集合,以0下标为开始进行集合中元素的索引。

⑤ ndarray对象是用于存放同类型元素的多维数组。

⑥ ndarray中每个元素在内存中都有相同存储大小的区域。

import numpy as np

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

print(a)

print(a.ndim) # ndarry维度

print(a.shape) # ndarry形状

print(a.size) # ndarry元素个数

print(a.dtype) # ndarry元素类型

运行结果:

[[1 2 3]

[4 5 6]]

2

(2, 3)

6

int32

import numpy as np

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

print(a)

print(a.ndim) # ndarry维度跟最外层括号[]有关

# 第一个括号去掉,有一个元素,所以第一维为1,第二个括号去掉有两个元素,所以第二维为2

print(a.shape)

print(a.size)

print(a.dtype) # a中元素为int32

运行结果:

[[[1 2 3]

[4 5 6]]]

3

(1, 2, 3)

6

int32

import numpy as np

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

print(a) # 当不同长度时,np.array会将里面的数组转换为列表

print(a.ndim) # 只有两维,存的的是两个列表,所以减少一维

print(a.shape)

print(a.size)

print(a.dtype) # a中元素为对象了

运行结果:

[[list([1, 2, 3, 8]) list([4, 5, 6])]]

2

(1, 2)

2

object

import numpy as np

a = np.array([[[1,2.0,3],[4,5,6]]]) # 有一个浮点型 2.0

print(a) # 全部变为浮点型了

print(a.ndim)

print(a.shape)

print(a.size)

print(a.dtype) # 变为浮点型数据了

运行结果:

[[[1. 2. 3.]

[4. 5. 6.]]]

3

(1, 2, 3)

6

float64

2) numpy 数据类型

① 创建numpy数组的时候可以通过属性dtype显示指定数据的类型。

② 在不指定数据类型的情况下,numpy会自动推断出适合的数据类型。

③ 如果需要更改一个已经存在的数组的数据类型,可以通过astype方法进行修改从而得到一个新数组。

a2 = np.array([1,2,3,4]) # 自动推断出合适的数据类型,里面无浮点数,变为int32

print(a2.dtype)

a3 = a2.astype(float) # astype得到的是一个新数组,原数组没有改变。

print(a2.dtype)

print(a2)

print(a3.dtype)

print(a3)

运行结果:

int32

int32

[1 2 3 4]

float64

[1. 2. 3. 4.]

3) numpy 常用方法

① arange()函数:类似python的range函数,通过指定开始值、终值和步长来创建一个一维数组,注意:最终创建的数组不包含终值。

② linspace()函数:通过指定开始值、终值和元素个数来创建一个一维数组,数组的数据元素符合等差数列,可以通过endpoint关键字指定是否包含终值,默认包含终值。

③ logspace()函数:和linspace函数类似,不过创建的是等比数列数组。

④ random()函数:创建0-1之间的随机元素,数组包含的元素数量由参数决定。

import numpy as np

x = np.empty([3,2],dtype = np.int) # 产生3行2列的二维数组,数组中每个元素都是随机数

x

运行结果:

array([[ 757935392, 757935405],

[ 170732845, 538976288],

[ 540680291, 1634890337]])

# 创建数组的时候,可以用列表或者元组指定它的形状

x = np.zeros((5,),dtype = np.int) # 等价于 x = np.zeros([5],dtype = np.int)

x # array是数组的意思,表示x是一个一维数组,数组里面每个元素都是0

运行结果:

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

# 把一个数组转换为numpy,如果长度不相等,则存储的是元组对象

b = [(1,2,3),(4,5)]

a = np.asarray(b)

print(a.dtype) # 变成对象了

a

运行结果:

object

array([(1, 2, 3), (4, 5)], dtype=object)

# 如果长度相等,则把里面的元组转换为ndarray

b = [(1,3),(4,5)]

a = np.asarray(b)

a

运行结果:

array([[1, 3],

[4, 5]])

b = np.asarray([1,2,3,4]).reshape(2,2)

b.shape

运行结果:

(2, 2)

a = np.asarray([1,2,3,4,5,6,7,8,9,10,11,12]).reshape((-1,2,3)) # -1表示自动的,也就是所有的元素除以2除以3后的数据

b = np.asarray([1,2,3,4,5,6,7,8,9,10,11,12]).reshape((2,-1))

c = np.asarray([1,2,3,4,5,6,7,8,9,10,11,12]).reshape((2,-1,2))

print(a)

print(b)

print(c)

运行结果:

[[[ 1 2 3]

[ 4 5 6]]

[[ 7 8 9]

[10 11 12]]]

[[ 1 2 3 4 5 6]

[ 7 8 9 10 11 12]]

[[[ 1 2]

[ 3 4]

[ 5 6]]

[[ 7 8]

[ 9 10]

[11 12]]]

x = np.arange(5, dtype = float)

x # 产生一个0-4的浮点型数组

运行结果:

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

q = np.linspace(0,10,7)

print(q) # 数组里有点.的的原因是linspace方法默认返回的数据类型是浮点型

print(q.astype('int32')) # q的复制品变为int32型

print(q) # q并没有变化

运行结果:

[ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333

10. ]

[ 0 1 3 5 6 8 10]

[ 0. 1.66666667 3.33333333 5. 6.66666667 8.33333333

10. ]

4) numpy 修改形状

① 对于一个已经存在的ndarray数组对象而言,可以通过修改形状相关的参数/方法从而改变数组的形状。

② 直接使用reshape函数创建一个改变尺寸的新数组,原数组的shape保持不变,但是新数组和原数组共享一个内存空间,也就是修改任何一个数组中的值都会对另外一个产生影响,另外要求新数组的元素个数和原数组一致。

a = np.arange(10)

b = a[-3] # 索引获得的数值

c = a[7:8] # 切片获得的是数组

print(b)

print(c)

运行结果:

7

[7]

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

print(a.ndim)

b = a[2,2] # 用一次索引降低一个维度

print(b.ndim) # 用了两次索引,0维,为一个值

c = a[1:,2]

print(c)

print(c.ndim) # 用了一次索引,1维,为一维数组

d = a[1:,:2] # 中括号能触发魔术方法

print(d)

print(d.ndim) # 没有用索引,2维,为二维数组

运行结果:

2

0

[6 9]

1

[[4 5]

[7 8]]

2

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

print(x)

y = x[1:3,[1,2]]

print(y)

print(y.ndim)

z = x[[1,2],1:3]

print(z)

print(z.ndim)

m = x[1:3,1:3]

print(m)

print(m.ndim)

n = x[[1,2],[1,2]] # 都是数组时,取的是值,数组维数为一维

print(n)

print(n.ndim)

运行结果:

[[1 2 3]

[4 5 6]

[7 8 9]]

[[5 6]

[8 9]]

2

[[5 6]

[8 9]]

2

[[5 6]

[8 9]]

2

[5 9]

1

import numpy as np

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

print(a)

print(a.ndim)

b = a[1:3,[1,2]]

print(b)

print(b.ndim)

c = a[[1,2],[1,2]]

print(c)

print(c.ndim)

运行结果:

[[1 2 3]

[4 5 6]

[7 8 9]]

2

[[5 6]

[8 9]]

2

[5 9]

1

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

print(a[...,1]) # 取第二列

print(a[1,...]) # 取第二行

print(a[2]) # 取第三行

# ...表示不进行任何操作,和冒号:一样的意思

运行结果:

[2 5 8]

[4 5 6]

[7 8 9]

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

print(x)

# 数组,数组 → 取行和列中对应元素,维度为1维

y = x[[0,1,2],[0,1,0]] # [0,1,2] 取的每行的所有,即第0行、第1行、第2行 此方法相对切片可以得到任意位置

print(y)

运行结果:

[[1 2]

[3 4]

[5 6]]

[1 4 5]

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

print(x)

# 切片,数组 → 取行对应元素,维度不变

y = x[1:3,[0,1]] # 取第0列、第1列元素

z = x[1:3,[0,1,0]] # 取第0列、第1列、第0列元素

print(y)

print(z)

运行结果:

[[1 2]

[3 4]

[5 6]]

[[3 4]

[5 6]]

[[3 4 3]

[5 6 5]]

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

y = x[[True,True,False]] # 取第0行、第1行,第3行不取

print(y)

y # 相对print(y),用y就有逗号

运行结果:

[[1 2] [3 4]]

array([[1, 2],

[3, 4]])

x = np.arange(32).reshape((8,4))

print(x)

x[[-4,-2,-1,-7]] # 取-4列、-2列、-1列、-7列的数组

运行结果:

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]

[12 13 14 15]

[16 17 18 19]

[20 21 22 23]

[24 25 26 27]

[28 29 30 31]]

array([[16, 17, 18, 19],

[24, 25, 26, 27],

[28, 29, 30, 31],

[ 4, 5, 6, 7]])

5) numpy 广播

① 广播是numpy对不同形状的数组进行数值计算的方式。

② 如果两个数组a和b形状相同,即满足 a.shape == b.shape,那么 a*b的结果就是 a与b数组对应位相乘。这要求维数相同,且各维度的长度相同。

③ 广播就是 a.shape != b.shape,但是数组a和b能进行运算,数组a通过广播与数组b兼容。

④ 数组a和b能进行运算有两点情况:1. 要么两个数组的维度相同。

2. 要么先比较最右边维度,看是否有一个为1,为1再看左边两个数组的维度是否相同或者为1。

⑤ 多个维度,只看最短的维度是否触发广播机制

6) numpy 转置

① 转置时重塑的一种特殊形式,它返回的是源数据的 视图(不会进行任何赋值操作)。

② 数组不仅有transpose方法,还有一个特殊的T属性。

import numpy as np

arr = np.arange(15).reshape((3,5))

print(arr)

# 方法一:

print(arr.T) # 用数组的T方法进行转置

# 方法二:

print(np.transpose(arr)) # 用transpose方法一进行转置

# 方法三:

print(arr.transpose(1,0)) # 用transpose方法二进行转置

print(arr) # 源数据没有变化

运行结果:

[[ 0 1 2 3 4]

[ 5 6 7 8 9]

[10 11 12 13 14]]

[[ 0 5 10]

[ 1 6 11]

[ 2 7 12]

[ 3 8 13]

[ 4 9 14]]

[[ 0 5 10]

[ 1 6 11]

[ 2 7 12]

[ 3 8 13]

[ 4 9 14]]

[[ 0 5 10]

[ 1 6 11]

[ 2 7 12]

[ 3 8 13]

[ 4 9 14]]

[[ 0 1 2 3 4]

[ 5 6 7 8 9]

[10 11 12 13 14]]

import numpy as np

arr = np.arange(120).reshape((2,3,4,5))

print(arr)

print(arr.shape)

print(arr.T) # 默认将第一个维度和第二个维度进行转换

print(arr.T.shape) # 第一个维度到最后一个维度,第二个维度到倒数第二个维度

运行结果:

[[[[ 0 1 2 3 4]

[ 5 6 7 8 9]

[ 10 11 12 13 14]

[ 15 16 17 18 19]]

[[ 20 21 22 23 24]

[ 25 26 27 28 29]

[ 30 31 32 33 34]

[ 35 36 37 38 39]]

[[ 40 41 42 43 44]

[ 45 46 47 48 49]

[ 50 51 52 53 54]

[ 55 56 57 58 59]]]

[[[ 60 61 62 63 64]

[ 65 66 67 68 69]

[ 70 71 72 73 74]

[ 75 76 77 78 79]]

[[ 80 81 82 83 84]

[ 85 86 87 88 89]

[ 90 91 92 93 94]

[ 95 96 97 98 99]]

[[100 101 102 103 104]

[105 106 107 108 109]

[110 111 112 113 114]

[115 116 117 118 119]]]]

(2, 3, 4, 5)

[[[[ 0 60]

[ 20 80]

[ 40 100]]

[[ 5 65]

[ 25 85]

[ 45 105]]

[[ 10 70]

[ 30 90]

[ 50 110]]

[[ 15 75]

[ 35 95]

[ 55 115]]]

[[[ 1 61]

[ 21 81]

[ 41 101]]

[[ 6 66]

[ 26 86]

[ 46 106]]

[[ 11 71]

[ 31 91]

[ 51 111]]

[[ 16 76]

[ 36 96]

[ 56 116]]]

[[[ 2 62]

[ 22 82]

[ 42 102]]

[[ 7 67]

[ 27 87]

[ 47 107]]

[[ 12 72]

[ 32 92]

[ 52 112]]

[[ 17 77]

[ 37 97]

[ 57 117]]]

[[[ 3 63]

[ 23 83]

[ 43 103]]

[[ 8 68]

[ 28 88]

[ 48 108]]

[[ 13 73]

[ 33 93]

[ 53 113]]

[[ 18 78]

[ 38 98]

[ 58 118]]]

[[[ 4 64]

[ 24 84]

[ 44 104]]

[[ 9 69]

[ 29 89]

[ 49 109]]

[[ 14 74]

[ 34 94]

[ 54 114]]

[[ 19 79]

[ 39 99]

[ 59 119]]]]

(5, 4, 3, 2)

import numpy as np

arr = np.arange(120).reshape((2,3,4,5))

arr.transpose(0,3,2,1).shape # 原本是arr.transpose(0,1,2,3) 因此指定第二个轴和第四个轴进行交换

运行结果:

(2, 5, 4, 3)

import numpy as np

arr = np.arange(120).reshape((2,3,4,5))

arr.swapaxes(1,3).shape # 跟 arr.transpose(0,3,2,1).shape 等价,swapaxes方法直接填写第一轴和第三轴即可

运行结果:

(2, 5, 4, 3)

# 元素0可表示为arr[0][0][0],元素6可表示为 arr[0][1][2] # 去掉一层括号,看它在哪个位置

arr = np.arange(24).reshape((2,3,4))

print(arr)

print(arr.transpose((1,0,2))) # 表示将轴1和0位置互换,轴2不变,即代表将轴0和1对换,轴2不变,亦即将arr[x][y][z]中x和y位置互换,整个数组将变换

print(arr.swapaxes(1,2)) # 表示将轴1和轴2位置互换,轴0不变

运行结果:

[[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]]

[[12 13 14 15]

[16 17 18 19]

[20 21 22 23]]]

[[[ 0 1 2 3]

[12 13 14 15]]

[[ 4 5 6 7]

[16 17 18 19]]

[[ 8 9 10 11]

[20 21 22 23]]]

[[[ 0 4 8]

[ 1 5 9]

[ 2 6 10]

[ 3 7 11]]

[[12 16 20]

[13 17 21]

[14 18 22]

[15 19 23]]]

# 矩阵线性代数相乘

arr = np.arange(6).reshape((2,3))

np.dot(arr.T,arr)

运行结果:

array([[ 9, 12, 15],

[12, 17, 22],

[15, 22, 29]])

6) numpy 数组合并

arr1 = np.arange(6).reshape((2,3))

print(arr)

print(np.hstack((arr1,arr1))) # 水平方向合并

print(np.vstack((arr1,arr1))) # 垂直方向合并

print(np.concatenate((arr1,arr1),axis = 1)) # 指定对x轴进行拼接

print(np.concatenate((arr1,arr1),axis = 0)) # 指定对y轴进行拼接

运行结果:

[[0 1 2]

[3 4 5]]

[[0 1 2 0 1 2]

[3 4 5 3 4 5]]

[[0 1 2]

[3 4 5]

[0 1 2]

[3 4 5]]

[[0 1 2 0 1 2]

[3 4 5 3 4 5]]

[[0 1 2]

[3 4 5]

[0 1 2]

[3 4 5]]

arr1 = np.arange(24).reshape((2,3,4))

print(arr1.shape)

print(np.concatenate((arr1,arr1),axis = 1).shape) # 对第二个维度进行拼接

print(np.concatenate((arr1,arr1),axis = 0).shape) # 对第一个维度进行拼接

print(np.concatenate((arr1,arr1),axis = 2).shape) # 对第三个维度进行拼接

运行结果:

(2, 3, 4)

(2, 6, 4)

(4, 3, 4)

(2, 3, 8)

6) numpy 聚合函数

① 聚合函数是对一组值(例如一个数组)进行操作,返回一个单一值作为结果的函数。

② 聚合函数也可以指定对某个具体的轴进行数据聚合操作;常用的聚合操作有:平均值、最大值、最小值、方差等待。

import numpy as np

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

print(np.abs(arr1)) # 取绝对值

print(np.sqrt(arr1)) # 负数不能开根号

print(np.isnan(arr1))

运行结果:

[[1 2]

[3 4]]

[[1. nan]

[1.73205081 2. ]]

[[False False]

[False False]]

arr1 = np.array([[1,-2,4],[3,4,5],[2,5,6]])

print(arr1)

print(np.amin(arr1,0)) # 取列中最小的元素,等价 print(np.amin(arr1,axis = 0))

print(np.amin(arr1,1)) # 取行中最小的元素,等价 print(np.amin(arr1,axis = 1))

运行结果:

[[ 1 -2 4]

[ 3 4 5]

[ 2 5 6]]

[ 1 -2 4]

[-2 3 2]

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

y = np.argsort(x)

print(y) # 返回的是排序后 y 的索引

运行结果:

[1 2 0]

import numpy as np

x = np.arange(9,).reshape(3,3)

y = np.where(x>5) # 第一个数组为第一个轴的索引,第二个数组为第二个轴的索引

print(y) # 获得索引

print(x[y]) # 获得索引对应的值

运行结果:

(array([2, 2, 2], dtype=int64), array([0, 1, 2], dtype=int64))

[6 7 8]

二、我的自学路线

01 安装Python编辑器 [ 整理完 ]

02 Python编译器快捷键 [ 整理完 ]

03 Python基础 [ 整理完 ]

04 Python难点 [ 整理完 ]

05 Python常用的库 [ 整理完 ]

06 爬虫 [ 整理ing ]

07 NLP [ 看视频ing ]

三、笔记目录

1) Python 编辑器

2) Python 基础

03) Python 难点

04) Python 常用的库

( ……更多笔记,见专栏 )

"♥我的笔记,希望对你有帮助♥"



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3