numpy使用数组进行数据处理

meshgrid函数

理解:

二维坐标系中,X轴可以取三个值1,2,3, Y轴可以取三个值7,8, 请问可以获得多少个点的坐标?

显而易见是6个:

(1,7)(2,7)(3,7)

(1,8)(2,8)(3,8)

>>> import numpy as np#导入numpy
>>> a=np.array([1,2,3])#创建一维数组
>>> b=np.array([7,8])
>>> res=np.meshgrid(a,b)#获取所有点的横坐标和纵坐标
>>> res#返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
[array([[1, 2, 3],
[1, 2, 3]]), array([[7, 7, 7],
[8, 8, 8]])]

生成坐标绘制图像:

>>> import numpy as np
>>> points=np.arange(-5,5,0.01)#从-5到5步长为0.01
>>> xs,ys=np.meshgrid(points,points)
>>> ys
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
>>> z=np.sqrt(xs**2+ys**2)#函数的求值运算
>>> z
array([[7.07106781, 7.06400028, 7.05693985, ..., 7.04988652, 7.05693985,
7.06400028],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
...,
[7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 , 7.03571603,
7.04279774],
[7.05693985, 7.04985815, 7.04278354, ..., 7.03571603, 7.04278354,
7.04985815],
[7.06400028, 7.05692568, 7.04985815, ..., 7.04279774, 7.04985815,
7.05692568]])
>>> import matplotlib.pyplot as plt
>>> plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()
<matplotlib.image.AxesImage object at 0x00000000087D6EB8>
<matplotlib.colorbar.Colorbar object at 0x000000000D8F4FD0>
>>> plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")
Text(0.5, 1.0, 'Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values')
>>>plt.show()

将条件逻辑表述为数组运算

根据cond中的值来对数组进行选取,如果cond中的值为True,那么就选择x中对应的值,否则就选择y中对应的值,比如cond[0]=True,那么result[0]处应当放置yarr[0]的值

>>> xarr=np.array([1.1,1.2,1.3,1.4,1.5])
>>> yarr=np.array([2.1,2.2,2.3,2.4,2.5])
>>> cond=np.array([True,False,True,True,False])
>>> result=[(x if c else y) for x,y,c in zip(xarr,yarr,cond)]
>>> result
[1.1, 2.2, 1.3, 1.4, 2.5]

where方法

使用矢量

where方法可以取代上面的写法

>>> result=np.where(cond,xarr,yarr)
>>> result
array([1.1, 2.2, 1.3, 1.4, 2.5])

使用标量

np.where的第二个和第三个参数不必是数组,它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。假设有一个由随机数据组成的矩阵,你希望将所有正值替换为2,将所有负值替换为-2。若利用np.where,则会非常简单:

>>> arr=np.random.randn(4,4)
>>> arr
array([[-0.02461196, -0.11867552, 0.49004256, -0.25236766],
[ 1.66484493, -0.41180743, -0.34837293, -2.61422661],
[ 0.51476568, -0.41451909, 1.28553372, 0.13866799],
[-0.94795594, -1.49302099, 1.18480636, 0.20310613]])
>>> arr>0
array([[False, False, True, False],
[ True, False, False, False],
[ True, False, True, True],
[False, False, True, True]])
>>> np.where(arr>0,2,-2)
array([[-2, -2, 2, -2],
[ 2, -2, -2, -2],
[ 2, -2, 2, 2],
[-2, -2, 2, 2]])

标量矢量结合

如果对应位置是True,那么新的数组对应位置为2,否则就还是原来的数值

>>> np.where(arr>0,2,arr)
array([[-0.02461196, -0.11867552, 2. , -0.25236766],
[ 2. , -0.41180743, -0.34837293, -2.61422661],
[ 2. , -0.41451909, 2. , 2. ],
[-0.94795594, -1.49302099, 2. , 2. ]])

数学统计方法

mean函数

对所有的元素求均值

>>> import numpy as np
>>> arr=np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> arr.mean()
5.0
>>> np.mean(arr)
5.0

sum函数

对所有元素求和

>>> arr.sum()
45

可选轴求值

>>> arr.mean(axis=1)#列求平均值
array([2., 5., 8.])
>>> arr.mean(axis=0)#行求平均值
array([4., 5., 6.])
>>> arr.sum(axis=0)
array([12, 15, 18])#行求和
>>> arr.sum(axis=1)
array([ 6, 15, 24])#列求和

cumsum函数

1.对于一维输入a(可以是list,可以是array,假设a=[1, 2, 3, 4, 5, 6, 7] ,就是当前列之前的和加到当前列上,如下:

>>>import numpy as np
>>> a=[1,2,3,4,5,6,7]
>>> np.cumsum(a)
array([ 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 75, 105])

2.对于二维输入a,axis=0(第1行不动,将第1行累加到其他行);axis=1(进入最内层,转化成列处理。第1列不动,将第1列累加到其他列),如下:

>>>import numpy as np
>>> c=[[1,2,3],[4,5,6],[7,8,9]]
>>> np.cumsum(c,axis=0)
array([[ 1, 2, 3],
[ 5, 7, 9],
[12, 15, 18]])
>>> np.cumsum(c,axis=1)
array([[ 1, 3, 6],
[ 4, 9, 15],
[ 7, 15, 24]])

cumprod函数

累乘方法同理

>>> arr.cumprod(axis=1)
array([[ 1, 2, 6],
[ 4, 20, 120],
[ 7, 56, 504]], dtype=int32)

布尔数组的方法

sum方法

>>> import numpy as np
>>> arr=np.random.randn(100)
>>> arr>0
array([ True, True, False, True, True, True, True, True, True,
False, True, False, False, True, True, True, False, True,
True, False, False, True, True, True, False, False, True,
True, False, True, True, True, False, False, True, False,
True, False, False, True, False, False, True, False, False,
True, False, True, True, False, True, True, True, False,
False, False, False, True, True, True, True, False, True,
False, False, True, False, False, True, True, True, False,
True, False, False, False, True, False, True, True, True,
True, False, False, False, False, False, False, False, True,
False, False, True, False, False, False, True, False, True,
False])
>>> (arr>0).sum()
51
>>>

any方法

any用于测试数组中是否存在一个或多个True

>>> bools=np.array([False,False,True,True])
>>> bools.any()
True

all方法

all则检查数组中所有值是否都是True

>>> bools.all()
False

排序

一维数组

>>> arr=np.random.randn(6)
>>> arr
array([-1.55689999, 0.59917555, 0.09981181, -0.74146468, 0.48666154,
-1.06564002])
>>> arr.sort()
>>> arr
array([-1.55689999, -1.06564002, -0.74146468, 0.09981181, 0.48666154,
0.59917555])
>>>

多维数组

多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort即可:

>>> arr=np.random.randn(5,3)
>>> arr
array([[ 0.26943933, 1.2985981 , 0.24338663],
[ 0.22550084, -0.03952026, 0.32522357],
[-1.96626749, -0.14959244, 1.19403458],
[-0.14429635, 1.42566274, -1.13627841],
[ 1.00049286, -0.44634922, -0.59281931]])
>>> arr.sort(1)
>>> arr
array([[ 0.24338663, 0.26943933, 1.2985981 ],
[-0.03952026, 0.22550084, 0.32522357],
[-1.96626749, -0.14959244, 1.19403458],
[-1.13627841, -0.14429635, 1.42566274],
[-0.59281931, -0.44634922, 1.00049286]])
>>> arr.sort(0)
>>> arr
array([[-1.96626749, -0.44634922, 0.32522357],
[-1.13627841, -0.14959244, 1.00049286],
[-0.59281931, -0.14429635, 1.19403458],
[-0.03952026, 0.22550084, 1.2985981 ],
[ 0.24338663, 0.26943933, 1.42566274]])

顶级方法np.sort返回的是数组的已排序副本,而就地排序则会修改数组本身。

唯一化以及其它的集合逻辑

unique方法

去重加上排序

>>> names=np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
>>> np.unique(names)
array(['Bob', 'Joe', 'Will'], dtype='<U4')
>>> values=np.array([6, 0, 0, 3, 2, 5, 6])
>>> np.unique(values)
array([0, 2, 3, 5, 6])

in1d方法

测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组

>>> values = np.array([6, 0, 0, 3, 2, 5, 6])
>>> np.in1d(values,[2,3,6])
array([ True, False, False, True, True, False, True])

6在2,3,6中,0没在2,3,6中,依次类推

数组集合运算

numpy使用数组进行数据处理的更多相关文章

  1. Numpy 利用数组进行数据处理

    Numpy数组使你可以将许多种数据处理任务表述为简洁的数组表达式(否则需要编写循环). 用数组表达式代替循环的做法,通常被称为矢量化.一般来说,矢量化数组运算要比等价的纯跑一趟湖南快 上一两个数量级( ...

  2. numpy利用数组进行数据处理

    将条件逻辑表述为数组运算 numpy.where()是一个三目运算的表达式 In [34]: xarr = np.array([1.1,1.2,1.3,1.4,1.5]) In [35]: yarr ...

  3. 利用Python进行数据分析 第4章 NumPy基础-数组与向量化计算(3)

    4.2 通用函数:快速的元素级数组函数 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数. 1)一元(unary)ufunc,如,sqrt和exp函数 2)二元(unary) ...

  4. python数据分析 Numpy基础 数组和矢量计算

    NumPy(Numerical Python的简称)是Python数值计算最重要的基础包.大多数提供科学计算的包都是用NumPy的数组作为构建基础. NumPy的部分功能如下: ndarray,一个具 ...

  5. NumPy 迭代数组

    NumPy 迭代数组 NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. 接下来我们使用 arange() ...

  6. 找出numpy array数组的最值及其索引

    在list列表中,max(list)可以得到list的最大值,list.index(max(list))可以得到最大值对应的索引 但在numpy中的array没有index方法,取而代之的是where ...

  7. python 工具 字符串转numpy浮点数组

    不同的数字之间使用 空格“ ”,“$”,"*"等隔开,支持带小数点的字符串NumArray=str2num(LineString,comment='#')将字符串中的所有非Doub ...

  8. Numpy | 04 数组属性

    NumPy 数组的维数称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推. 在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions).比如说,二 ...

  9. Lesson10——NumPy 迭代数组

    NumPy 教程目录 NumPy 迭代数组 NumPy 迭代器对象  numpy.nditer  提供了一种灵活访问一个或者多个数组元素的方式. 迭代器最基本的任务的可以完成对数组元素的访问. Exa ...

随机推荐

  1. 3、Grid、GridSplitter 网格分离器、SharedSizeGroup 共享尺寸组

    Grid——网格布局,是WPF中最强大的布局容器,可以实现任何其他容器的布局.一个网格中只展示一个元素,若要展示多元素,可用容器 布局舍入:网格的边界有时会模糊,如三等分100宽度无法被整除.推荐设定 ...

  2. 《剑指offer》算法题第二天

    今日题目(分别对应剑指书3~9题): 数组中重复的数字 二维数组中的查找 替换空格 从尾到头打印链表 重建二叉树 二叉树的下一个节点 用两个栈实现队列 今日重点为1,2,5,6,后面会有详细的思路解析 ...

  3. H5+JAVA的文件上传,断点续传

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  4. 【LOJ2604】「NOIP2012」开车旅行

    [题目链接] [点击打开链接] [题目大意] 从西到东的坐标轴\([1,n]\)上有\(n\)个海拔互不相同的城市,每两个城市之间的距离定义为\(dis(i,j)=|h_i-h_j|\) 小\(A\) ...

  5. JDK_API剖析之java.io包

    Java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入. 一.接口 1.Closea ...

  6. SPP框架的基本使用

    入职两天 Day1.Day2: 学习SPP框架 SPP是什么? SPP提供了一系列的基础功能,是一个通用的网络服务器运行框架.主要由proxy,worker,controller三个模块组成.它提供A ...

  7. Android_(菜单)选项菜单

    Android系统中菜单分为Options Menu.Context Menu.Sub Men三种 Options Menu和Context Menu属于一级菜单 Sub Menu属于Options ...

  8. Alibaba DataX 源码编译

    Alibaba DataX 源码编译 标签(空格分隔): ETL DataX简介 设计理念 为了解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路,DataX作为中间传输载体负 ...

  9. windos下hosts文件

    win+R c:\windows\system32\drivers\etc

  10. windows 简单实用Elasticsearch

    官网下载地址:https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/zip/e ...