Numpy 学习 第五篇:数组的高级操作

数组的高级操作主要是组合数组,拆分数组,tile数组和重组元素。

一,组合数组

一维数组相当于是1行N列的数组,当使用column_stack()时,该一维数组作为一个新列;当使用hstack()函数时,为原始数组新增N列;当使用vstack()函数时,为原始数组新增1行。

1,把一维数组作为列添加到二维数组中

tup是一个数组的序列,按照列堆叠时,相当于二维数组新增一列;按照行堆叠时,相当于增加一列行:

numpy.column_stack(tup)
numpy.row_stack(tup)

举个例子,把两个一维数组按照行/列堆叠成一个二维数组:

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

2,水平(按列)顺序堆叠数组

按列对原始数组进水平(horizontally ,column),垂直(vertically ,row)或者深度(depth,third asix)扩展,参数tup是数组的序列:

numpy.stack(arrays, axis=0)
numpy.hstack(tup)
numpy.vstack(tup)
numpy.dstack(tup)

举个例子,分别对数组进行列堆叠、水平堆叠和垂直堆叠:

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

>>> np.vstack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5, 6])
>>> np.dstack((a,b))
array([[[1, 4],
        [2, 5],
        [3, 6]]])

3,拼接数组

numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")

参数axis默认值是0,标识按照行来拼接,如果设置为None,那么所有的数组将展开为一维,并拼接在一起。

举个例子:

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
       [3, 4],
       [5, 6]])
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
       [3, 4, 6]])
np.concatenate((a, b), axis=None)
array([1, 2, 3, 4, 5, 6])

二,vectorize 向量化和 apply函数

1,vectorize

numpy.vectorize()函数定义一个向量化函数,它以序列或numpy数组作为输入,对numpy数组做向量化操作。函数输出的数据类型是由otypes参数确定的,如果otypes=None,那么输出的数据类型是通过使用输入的第一个元素调用函数来确定的,该函数返回一个函数对象。

numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None)

参数注释:

  • pyfunc:函数对象
  • otype:输出数据的类型(putput data type)

使用vectorize()定义一个向量化函数,对数组做向量化操作:

def myfunc(a, b):
    return a-b if a>b else a+b

vfunc = np.vectorize(myfunc)
vfunc([1, 2, 3, 4], 2)
#output array([3, 4, 1, 2])

2,apply族函数

沿着特定的维度,在一维数组切片上应用函数:

numpy.apply_along_axis(func1d, axis, arr, *args, **kwargs)

举个例子,传递的一维数组是列,按照列值计算两个端点的均值:

>>> def my_func(a):
...     """Average first and last element of a 1-D array"""
...     return (a[0] + a[-1]) * 0.5
>>> b = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> np.apply_along_axis(my_func, 0, b)
array([4., 5., 6.])

三,栅格数据

对于mgrid()函数,用于生成多维数据,参数是一个序列,常用于生成1维,2维和3维数据:

np.mgrid[ 第1维,第2维 ,第3维 , …] 

第n维的书写形式为:

start:end:step

如果step为整数,表示间隔,左闭右开;如果step为 int + j,表示点数,左闭右闭。

对于np.meshgrid()用于生成网格型数据,接受两个一维数组生成两个二维矩阵,对应两个数组中所有的(x,y)对。

np.meshgrid(x, y)

四,查找函数

1,查找最大值或最小值所在的索引

按照特定的轴查找最大值或最小值的索引

numpy.argmax(a, axis=None, out=None, *, keepdims=<no value>)
numpy.argmin(a, axis=None, out=None, *, keepdims=<no value>)

举个例子,查找最小值的索引:

>>> a = np.arange(6).reshape(2,3) + 10
>>> a
array([[10, 11, 12],
       [13, 14, 15]])
>>> np.argmin(a)
0
>>> np.argmin(a, axis=0)
array([0, 0, 0])
>>> np.argmin(a, axis=1)
array([0, 0])

2,查找非0元素的索引

numpy.argwhere(a)

举个例子,查找数组中大于0的元素的索引:

>>> x = np.arange(6).reshape(2,3)
>>> x
array([[0, 1, 2],
       [3, 4, 5]])
>>> np.argwhere(x>1)
array([[0, 2],
       [1, 0],
       [1, 1],
       [1, 2]])

3,查找操作

查找操作是指按照特定的条件对数组元素进行三值运算

where()函数对每一个元素执行三值运算:当满足condition 时,返回x;否则,返回y

numpy.where(condition[, x, y])

举个例子,对于一维数组,当元素值小于5时,返回原值;当元素值大于5时,乘以10返回:

>>> a = np.arange(10)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.where(a < 5, a, 10*a)
array([ 0,  1,  2,  3,  4, 50, 60, 70, 80, 90])

4,抽取元素

返回满足条件的数据元素,当参数condition为True,返回该位置的元素:

numpy.extract(condition, arr)

举个例子,extract()函数和掩码索引数组的功能相同:

>>> arr = np.arange(12).reshape((3, 4))
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> condition = np.mod(arr, 3)==0
>>> condition
array([[ True, False, False,  True],
       [False, False,  True, False],
       [False,  True, False, False]])
>>> np.extract(condition, arr)
array([0, 3, 6, 9])
If condition is boolean:

>>>
>>> arr[condition]
array([0, 3, 6, 9])

五,相关性

1,返回 Pearson 积矩相关系数

numpy.corrcoef(x, y=None, rowvar=True, *, dtype=None)

2,协方差矩阵

根据data和weight,计算协方差矩阵:

numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None, *, dtype=None)

计算的逻辑:

m = np.arange(10, dtype=np.float64)
f = np.arange(10) * 2
a = np.arange(10) ** 2.
ddof = 1
w = f * a
v1 = np.sum(w)
v2 = np.sum(w * a)
m -= np.sum(m * w, axis=None, keepdims=True) / v1
cov = np.dot(m * w, m.T) * v1 / (v1**2 - ddof * v2)

3,相关性

计算两个一维序列的相关性

numpy.correlate(a, v, mode='valid')

举个例子:

np.correlate([1, 2, 3], [0, 1, 0.5])
array([3.5])

六,统计方法

NumPy内置数据分析常用的统计量:

  • mean():计算元素的均值
  • median():计算中位数
  • var():计算元素的方差
  • std() :计算元素标准差
  • max():计算元素的最大值
  • min():计算元素的最小值
  • ptp():计算元素的取值范围,即最大值和最小值的差值
  • percentile():计算百分位
  • quantile():计算分为数
  • count_nonzero():计数
  • cumsum:计算所有元素的累计和
  • cumprod:计算所有元素的累计积

1,求和

举个例子,创建一个二维数组,按照行和列分别求和:

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

r1=a.sum()
r2=a.sum(axis=0)
r3=a.sum(axis=1)

print('a.sum() = {0}
a.sum(axis=0) = {1}
a.sum(axis=1) ={2}'.format(r1,r2,r3))

2,求积

举个例子,创建一个二维数组,按照行和列分别求乘积:

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

r1=a.prod()
r2=a.prod(axis=0)
r3=a.prod(axis=1)

print('a.prod() = {0}
a.prod(axis=0) = {1}
a.prod(axis=1) ={2}'.format(r1,r2,r3))

3,计算数组的均值

计算数组的均值,或者某一个维度的均值:

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

r1=a.mean()
r2=a.mean(axis=0)
r3=a.mean(axis=1)

print('a.mean() = {0}
a.mean(axis=0) = {1}
a.mean(axis=1) ={2}'.format(r1,r2,r3))

4,统计非0元素的个数

作为示例,考虑只包含1和0的一维向量中,统计从0 到 1 转换的数量,在矢量化形式中,没有明确的for循环或直接引用各个元素:

>>> np.count_nonzero(x[:-1] < x[1:])

 

参考文档:

numpy Routines

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/ljhdo/p/15071952.html