利用数组进行数据处理

Part 1

  numpy数组使你可以将许多数据处理任务表述为间接的数组表达式(否则需要编写循环)。用数组表达式代替循环的做法,通常被称为矢量化。一般来说,矢量化数组运算要比等价的纯python方式要快上一两个数量级(甚至更多),尤其是各种数值计算。

import numpy as np
points = np.arange(-5,5,0.01)
x,y = np.meshgrid(points,points)
y
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]])

 

 

import matplotlib.pyplot as plt
z = np.sqrt(x**2+y**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]])

 

 

plt.title('Image plot of $\sqrt{x^2+y^2}$ for a grid of values')
plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()

 

Part 2

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

  numpy.where 是三元表达式的矢量化版本。  

  官方文档:https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html   

In [1]: import numpy as np

In [2]: xarr = np.array([1.1,1.2,1.3])

In [3]: yarr = np.array([2.1,2.2,2.3])

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

In [5]: result = np.where(cond,xarr,yarr)

In [6]: result
Out[6]: array([1.1, 2.2, 1.3])

  np.where的第二个和第三个参数不必是数组。它们都可以是标量值。在数据分析工作中,where通常用于根据另一个数组而产生一个新的数组。

  假设有一个由随机数据组成的矩阵。你希望将所有正值替换为2,将所有负值替换为-2。利用np.where,则会非常简单。

arr = randn(4,4)
arr
array([[-3.54522971,  1.68063071,  1.1204201 ,  1.13209986],
       [ 0.40560108, -0.25336595,  0.32044861, -1.39082664],
       [ 0.2424607 ,  1.24353322, -2.02133435, -0.60433901],
       [-0.82997538,  1.00716739,  0.37567233,  0.90534339]])
numpy.where(arr>0,2,-2)
array([[-2,  2,  2,  2],
       [ 2, -2,  2, -2],
       [ 2,  2, -2, -2],
       [-2,  2,  2,  2]])

 

Part 3

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

  unique(x)  计算x中的唯一元素,并返回有序结果

In [1]: import numpy as np

In [2]: np.unique(np.array([1,3,4,3]))
Out[2]: array([1, 3, 4])

  intersect1d(x,y)  计算 x 和 y 中的公共元素,并返回有序结果

In [4]: np.intersect1d(np.array([1,2,3]),np.array([2,3,4]))
Out[4]: array([2, 3])

  union1d(x,y)

In [5]: np.union1d(np.array([1,2,3]),np.array([2,3,4]))
Out[5]: array([1, 2, 3, 4])

  in1d(x,y)  得到一个表示 x 的元素是否包含于 y 的布尔型数组

In [6]: np.in1d(np.array([1,2,3]),np.array([2,3,4]))
Out[6]: array([False,  True,  True])

  setdiff1d(x,y)  集合的差,即元素在 x 中且不再 y 中

In [7]: np.setdiff1d(np.array([1,2,3]),np.array([2,3,4]))
Out[7]: array([1])

  setxor1d(x,y)  集合的对称差,即存在于一个数组中,但不同时存在于两个数组中的元素。简单来说,就是“异或”

In [8]: np.setxor1d(np.array([1,2,3]),np.array([2,3,4]))
Out[8]: array([1, 4])

 

posted @ 2018-05-22 23:42  骑者赶路  阅读(148)  评论(0编辑  收藏  举报