上期数组的索引和切片的知识总结通道:数组的索引和切片

数组和标量间的运算

数组之所以强大而且重要的原因,是其不需要通过循环就可以完成批量计算,也就是矢量化

import numpy as np

a = [1,2,3]

b=[]

for i in a:

b.append(i*10)

b

out[1]:

[10, 20, 30]

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

arr *10

out[2]:

array([10, 20, 30])

相同维度的数组的算术运算都可以直接应用到元素中,也就是元素级运算

arr*arr

out[3]:

array([1, 4, 9])

arr - arr

out[4];

array([0, 0, 0])

通用函数

通用函数(ufunc)是一种对数组中的数据执行元素级运算的函数。例如:通过abs函数求绝对值,square函数求平方

arr = np.random.randn(3,3)

arr

out[5];

array([[-0.17634898, 1.24131891, -1.55449196],

[ 0.04820966, -0.1420969 , -0.80747892],

[-0.05187637, 0.41997844, -2.12123818]])

np.abs(arr)

out[6]:

array([[0.17634898, 1.24131891, 1.55449196],

[0.04820966, 0.1420969 , 0.80747892],

[0.05187637, 0.41997844, 2.12123818]])

np.square(arr)

out[7];

array([[3.10989635e-02, 1.54087265e+00, 2.41644525e+00],

[2.32417090e-03, 2.01915297e-02, 6.52022212e-01],

[2.69115814e-03, 1.76381893e-01, 4.49965142e+00]])

以上函数都是传入一个数组,所以这些函数都是一元函数。有些函数需要传入俩个数组并返回一个数组,这些函数被称为二元函数。例如:add函数用于俩个数组相加,minimun函数可以计算元素最小值。

arr1 = np.random.randint(1,10,size = (5))

arr1

out[8]:

array([1, 8, 3, 2, 1])

arr2 = np.random.randint(1,10,size = (5))

arr2

out[9];

array([4, 8, 7, 4, 3])

np.add(arr1,arr2)

out[10]:

array([ 5, 16, 10, 6, 4])

np.minimum(arr1,arr2)

out[11]

array([1, 8, 3, 2, 1])

有些通用函数还可以返回俩个数组,例如:modf函数,可以返回数组元素的小数和整数部分

arr1 = np.random.normal(2,4,size=(6,))

arr

out[12]:

array([[-0.17634898, 1.24131891, -1.55449196],

[ 0.04820966, -0.1420969 , -0.80747892],

[-0.05187637, 0.41997844, -2.12123818]])

np.modf(arr)

out[13]:

(array([[-0.17634898, 0.24131891, -0.55449196],

[ 0.04820966, -0.1420969 , -0.80747892],

[-0.05187637, 0.41997844, -0.12123818]]),

array([[-0., 1., -1.],

[ 0., -0., -0.],

[-0., 0., -2.]]))

条件逻辑运算

首先创建三个数组

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

arr2 = np.array([5,6,7,8])

cond = np.array([True,False,False,True])

如果需要通过cond的值来选取arr1和arr2的值,当cond为True时,选择arr1否则选择arr2的值,那么可以通过if语句判断来实现。

result = [(x if c else y) for x,y,c in zip(arr1,arr2,cond)]

result

out[14];

[1, 6, 7, 4]

但这种方法存在俩个问题:第一,对大规模数组处理速度不是很快;第二,无法用于多维数组。若使用Numpy的where函数则可以解决这俩个问题

result = np.where(cond,arr1,arr2)

result

out[15]:

array([1, 6, 7, 4])

where函数中的第二个和第三个参数可以为标量。在数据分析,经常需要通过一些条件将数组进行处理。例如新建一个随机符合正态分布的数组,通过数据处理将正值替换为1,负值替换为-1.

arr = np.random.randn(4,4)

arr

out[16]:

array([[-0.47119857, 0.74300761, -2.02821269, -0.3549485 ],

[ 1.36356163, -0.61257804, 0.48115343, 0.86997115],

[-0.4559936 , 0.26179048, -1.20468106, -0.56509321],

[-0.23739251, 0.83751607, -0.33541895, 0.76305371]])

new_arr = np.where(arr>0,1,-1)

new_arr

out[17]

array([[-1, 1, -1, -1],

[ 1, -1, 1, 1],

[-1, 1, -1, -1],

[-1, 1, -1, 1]])

使用elif函数可以进行多条件的判别。np.where函数通过嵌套的where表达式也可以完成同样的功能

arr = np.random.randint(1,300,size=(3,3))

arr

out[18];

array([[203, 102, 270],

[136, 60, 106],

[126, 97, 64]])

new_arr = np.where(arr > 200,3,

np.where(arr>100,2,1))

new_arr

out[19]:

array([[3, 2, 3],

[2, 1, 2],

[2, 1, 1]])

统计运算

Numpy库支持对整个数组或按指定轴向的数据进行统计计算,例如,sum函数用于求和;mean函数用于求算术平均数;std函数用于求标准差。

arr = np.random.randn(4,4)

arr

out[20]

array([[ 0.30819793, -1.06144959, 1.46672816, 1.18847115],

[ 0.87732943, -1.58171074, -0.6957929 , 0.72827265],

[ 0.31470934, -0.46280001, -0.40335385, 1.52528851],

[ 2.28676812, 0.20790929, -0.11272405, 1.74249516]])

arr.sum()

out[21];

6.328338600041427

arr.mean()

out[22];

0.3955211625025892

arr.std()

out[23]

1.0515585180241533

上面这些函数也可以传入axis参数,用于计算指定轴方向的统计值

arr.mean(axis=1)

out[24];

array([ 0.47548691, -0.16797539, 0.243461 , 1.03111213])

arr.sum(0)

out[25]:

array([ 3.78700481, -2.89805105, 0.25485737, 5.18452746])

cumsum和cumpod方法会产生计算结果组成的数组

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

arr

out[26]:

array([[0, 1, 2],

[3, 4, 5],

[6, 7, 8]])

arr.cumsum(0)

out[27];

array([[ 0, 1, 2],

[ 3, 5, 7],

[ 9, 12, 15]], dtype=int32)

arr.cumprod(1)

out[28]

array([[ 0, 0, 0],

[ 3, 12, 60],

[ 6, 42, 336]], dtype=int32)

#基本数组的统计方法

#方法 使用说明

#sum 求和

#mean 算术平均数

#std、var 标准差和方差

#min、max 最小值和最大值

#argmin、argmax 最小和最大元素的索引

#cumsum 所有元素的累计和

#cumprod 所有元素的累计积

布尔型数组运算

对于布尔型数组,其布尔值会被强制转换为1(True)和0(False)

arr = np.random.randn(20)

arr

out[29]:

array([-0.42961012, 0.56609038, -1.1741952 , -0.75376119, -1.09201392,

1.43960879, 0.87644242, -0.5947441 , 1.08380455, -0.06300785,

0.95369943, -1.27213285, 0.05017716, 0.27420381, -0.09095471,

-1.35379462, 0.61902337, -0.59390741, -0.22647004, -0.03306254])

(arr > 0).sum()

out[30]:

8

另外还有俩种方法any和all也可以用于布尔型数组运算。any方法用于测试数组中是否存在一个或多个True;all方法用于查找数组中的所有值是否为True

arr = np.array([True,False,False,True])

arr

out[31]:

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

arr.any()

out[32];

True

arr.all()

out[33]:

False

排序

与python列表类似,Numpy数组也可以通过sort()方法进行排序

arr = np.random.randn(10)

arr

out[34]:

array([ 2.2119974 , -1.52764083, 0.56082579, 0.14395966, 1.89882088,

0.70710935, -1.89196899, -2.40109916, 1.64130244, 2.65960228])

arr.sort()

arr

out[35]:

array([-2.40109916, -1.89196899, -1.52764083, 0.14395966, 0.56082579,

0.70710935, 1.64130244, 1.89882088, 2.2119974 , 2.65960228])

对于多维数组,可以通过指定轴方向进行排序

arr = np.random.randn(5,3)

arr

out[36]:

array([[ 2.45789818, 0.36223423, -0.77491822],

[-0.90154818, 0.03508642, 0.59097629],

[-1.11291537, 0.69388491, -0.53710136],

[ 0.3184309 , -0.1081375 , -0.65716382],

[-0.71120618, 1.60547342, -0.11556702]])

arr.sort(1)

arr

out[37]:

array([[-0.77491822, 0.36223423, 2.45789818],

[-0.90154818, 0.03508642, 0.59097629],

[-1.11291537, -0.53710136, 0.69388491],

[-0.65716382, -0.1081375 , 0.3184309 ],

[-0.71120618, -0.11556702, 1.60547342]])

集合运算

Numpy库中提供了针对一维数组的基本集合运算。在数据分析中,常用np.unique方法找出数组中的唯一值。

fruits = np.array(['apple','banana','pear','banana','pear','apple','pear'])

fruits

out[38]:

array(['apple', 'banana', 'pear', 'banana', 'pear', 'apple', 'pear'],

dtype='

np.unique(fruits)

out[39]:

array(['apple', 'banana', 'pear'], dtype='

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

arr

out[40]:

array([2, 3, 3, 2, 8, 1])

np.unique(arr)

out[41]:

array([1, 2, 3, 8])

注意:唯一值进行了排序

np.in1d方法用于测试几个数组中是否包含相同的值,返回一个布尔值数组。

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

arr

out[42]:

array([2, 3, 5, 7])

np.in1d(arr,[2,7])

out[43]:

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

#数组的集合运算

#方法 使用说明

#unique(x) 唯一值

#intersect1d(x,y) 公共元素

#union1d(x,y) 并集

#in1d(x,y) x的元素是否在y中,返回布尔型数组

#setdiff1d(x,y) 集合的差

#setxor1d(x,y) 交集取反

线性代数

对于矩阵而言,需要求的是点积,这里Numpy库提供了用于矩阵乘法的dot函数

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

arr1

out[44]:

array([[1, 2, 3],

[4, 5, 6]])

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

arr2

out[45]:

array([[0, 1, 2],

[3, 4, 5],

[6, 7, 8]])

np.dot(arr1,arr2)

out[46]:

array([[24, 30, 36],

[51, 66, 81]])

对于更多的矩阵计算,可通过Numpy库的linalg模块来完成

from numpy.linalg import det

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

arr

out[47]:

array([[1, 2],

[3, 4]])

det(arr)

out[48]:

-2.0000000000000004

注意:更多的矩阵运算说明可查看linalg帮助

python数组求和函数_python数据分析之Numpy数据库第三期数组的运算相关推荐

  1. python np dot函数_python科学计算之Numpy

    Numpy的组成与功能 Numpy(Numeric Python)可以被理解为一个用python实现的科学计算包,包括: 1.强大的N维数组对象Array: 2.成熟的函数库: 3.实用的线性代数.傅 ...

  2. 图解数据分析(9) | Numpy - 与1维数组操作(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  3. 图解数据分析(10) | Numpy - 与2维数组操作(数据科学家入门·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/33 本文地址:https://www.showmeai.tech/article-d ...

  4. python反序数函数_python range()函数取反序遍历sequence的方法

    python range()函数取反序遍历sequence的方法 python中的range函数取反序有两种方式 第一种:先构建一个列表,然后对列表中的元素进行反转. 例如: a=range(5) f ...

  5. 【Win32汇编】数组求和函数

    32位数组求和函数,esi 保存数组偏移,ecx 保存数组长度,同时用于 loop 计数, eax 返回和. .386 .model flat, stdcall .stack 4096 ExitPro ...

  6. python对二维数组统计某一行的去重计数_Python数据分析笔记——Numpy、Pandas库

    利用Python进行数据分析中有两个重要的库是Numpy和Pandas,本章将围绕这两个库进行展开介绍. Numpy库 Numpy最重要的一个特点是就是其N维数组对象,即ndarray,ndarray ...

  7. python多维数据分析_Python 数据分析:numpy 多维数组 ndarray

    下面的文章中,将使用约定俗成的模块名 np 来表示 NumPy 库. 1. 多维数组的创建 NumPy 提供了许多常用的函数来创建多维数组,先概览这些函数的名称及功能. 函数 说明 array 将输入 ...

  8. python数组去重函数_Python科学计算库Numpy之 数组操作

    操作ndarray 的方法 numpy.reshape:这个函数在不改变数据的条件下修改形状 numpy.ndarray.flat:该函数返回数组上的一维迭代器,行为类似 Python 内建的迭代器 ...

  9. python 组合数库函数_Python数据分析之Numpy库(笔记)

    2.1 ndarray多维数组 2.1.1 创建ndarray数组 通过NumPy库的array函数,即可轻松地创建ndarray数组.NumPy库能将数据(列表,元组,数组,或其他序列类型)转换为n ...

最新文章

  1. pymysql 写入数据
  2. linux su和sudo命令的区别
  3. java xml 反射_Java 读取XML文件以及Java 的反射机制实现
  4. redis集群搭建踩坑笔记
  5. 一幅GAN网络创造的肖像图卖了40万美金,但那又怎样?
  6. 从客户端(Content=p666/p)中检测到有潜在危险的 Request.Form 值。
  7. 深度优先搜索——单词接龙(洛谷 P1019)
  8. mysql用户权限重置_mysql中重置密码与新用户权限分配的方法介绍
  9. linux进程被杀掉日志,Linux进程突然被杀掉(OOM killer),查看系统日志
  10. 华为-2025十大趋势:智能世界,触手可及.pdf(附下载链接)
  11. Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
  12. 浅谈seo行业白菜价泛滥
  13. linearlayout之margin和peddling
  14. 分享一篇去年的项目总结
  15. 微信小程序点餐系统需求分析与建模
  16. 微软收购雅虎要中国政府审批?
  17. VBS隐藏bat窗口
  18. 如何在iOS 6 时代的App Store中推广
  19. Windows 下Nexus搭建Maven私服
  20. socket连接超时问题

热门文章

  1. 5.1.2 IO控制器
  2. SSM解决Mapper映射文件不发布
  3. Filter获取Spring Bean对象
  4. MySQL带EXISTS关键字的子查询
  5. 还不知道 Redis 分布式锁的背后原理?还不赶快学习一下
  6. 听说用 Lombok 可以早点下班?
  7. InnoDB与MyISAM等存储引擎对比
  8. 自己动手写一个单链表
  9. java基础(五) String性质深入解析
  10. 第五届蓝桥杯省赛javaB组试题解析