详解numpy中的数组操作(附源码)


Numpy定义

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,这种组合广泛用于替代 MatLab,是一个强大的科学计算环境,有助于我们通过 Python 学习数据科学或者机器学习。

NumPy 主要应用包括:

机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

为什么要用numpy

 Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。NumPy的出现弥补了这些不足。(——摘自张若愚的《Python科学计算》)

详情请参考:https://numpy.org/doc/stable/index.html

NumPy安装

因为numpy通常跟 scipy matplotlib一起使用,所以一起安装三个模块即可。

pip3 install --user numpy scipy matplotlib

numpy array基础使用

np数组的创建

import numpy as np

a = np.array([1,2,3,4]),#14列矩阵,即一维数组

b = np.arange(4) # 14列矩阵,元素递增1的一维数组

c = np.array([[1,2],[3,4]])  # 22列矩阵,即二维数组d = np.arange(4).reshape((2,2)) #变换输出 2行2列print (a)

print(type(a)) #输出a的类型print (b)

print (c)

print (d)

分别输出:

[1 2 3 4]

[0 1 2 3]

[[1 2]

 [3 4]]

[[0 1]

 [2 3]]

np数组的广播

广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行。如果两个数组 a 和 b 形状相同,即满足a.shape == b.shape,那么 a*b 的结果就是 a 与 b 数组对应位相乘。这要求维数相同,且各维度的长度相同。

例如代码

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

b = np.array([

10,20,30])

c = a * b

print (c)

输出

[10 40 90]

数组广播相加操作

a = np.array([[ 0, 0, 0], [10,10,10], [20,20,20], [30,30,30]]) #4x3 的二维数组

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

print(a + b)

输出

[[11 12 13]

 [2122 23]]

下面的图片展示了数组 b 如何通过广播来与数组 a 兼容。4x3 的二维数组与长为 3 的一维数组相加,等效于把数组 b 在二维上重复 4 次再运算:


np数组的切片和索引

ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。ndarray数组可以基于0-n的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。相信大家理解python list切片相关操作,一定会对该部分的内容感到熟悉,这里举几个经典的例子:

基础实例

import numpy as np

a = np.arange(10)  # [0 1 2 3 4 5 6 7 8 9]

b = a[5]  #下标5元素的值

c = np.array([[1,2,3],[3,4,5],[6,7,8]])print(b)

print(a[3:5]) #输出下标3-5的值,注意这里可以输出下限3,而不包括上限5

print(c[0,0]) #输出第一行第一列的元素即[1,2,3]中的1

print (c[...,1])   #2列元素print (c[1,...])   # 2行元素print (c[...,1:])  # 2列及剩下的所有元素

输出

5

[3 4]

1

[2 4 7]

[3 4 5]

[[2 3]

 [45]

 [78]]

布尔索引实例

我们可以通过一个布尔数组来索引目标数组。布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。

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

print (c[c > 3]) #打印出大于3的元素

输出

[4 5 6 7 8]

numpy array遍历

直接上代码,普通一维数组

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

for x in arr:

     print(x)

输出

1

2

3

定义一个numpy的二维数组,二维以上的数组这里不做讨论

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

遍历

for x in arr:

    print(x)

输出

[1 2 3]

[4 5 6

如果想一个一个地输出每一个元素,可以这样编写代码

for x in arr:

     for y in x:

          print(y)

输出

1

2

3

4

5

6

上面的方式比较麻烦,我们可以通过方法np.nditer实现一个一个地输出每一个元素

for x in np.nditer(arr):

       print(x)

输出

1

2

3

4

5

6

numpy array元素过滤

实例,在np数组中,过滤大于2的元素

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

newarr = arr[arr >2]

print(newarr)

输出

[3 4]

怎么样,是不是非常非常简单

numpy array 关于字符的处理

如果np数组中存储的是字符,如果相对字符元素进行相关操作,需要使用api —np.char

有这样一个需求,把字符'0.01%','1.1%','1.21%' 中的%去掉,并把字符转型为float类型。如何实现呢?代码如下:

b=np.array(['0.01%','1.1%','1.21%'])

newb=np.char.rstrip(b,'%').astype(float)

print(newb)

输出

[0.01 1.1 1.21]

其中:

Rstrip表示删除某个字符

astype(float)表示把元素转型为float

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容