Numpy模块

ndarray是一个通用的同构数据多维容器,也就是说所有的元素必须是相同数据类型的。

基本属性

  • ndarray.ndim 维度(秩)
  • ndarray.shape n行m列则为(n,m)
  • ndarray.size 元素个数n*m
  • ndarray.dtype 数据类型 int32, int16, float64……..

常用函数

arange,linspace,reshape,resize,ravel,flatten,

(ravel和flatten两者所要实现的功能是一致的(将多维数组降位一维),两者的区别在于返回拷贝(copy)还是返回视图(view),numpy.flatten()返回一份拷贝,对拷贝所做的修改不会影响(reflects)原始矩阵,而numpy.ravel()返回的是视图,会影响(reflects)原始矩阵。)

numpy常用统计函数和计算函数

all, any, apply_along_axis, argmax, argmin, argsort, average, bincount, ceil, clip, conj, corrcoef, cov, cross, cumprod(累乘), cumsum(累加), diff, dot, floor, inner, inv, lexsort, max, maximum, mean, median(中值), min, minimum, nonzero, outer, prod, re, round, sort, std, sum, trace, transpose, var, vdot, vectorize, where,sin,cos,exp

  • np.sum(),返回求和
  • np.mean(),返回均值
  • np.max(),返回最大值
  • np.min(),返回最小值
  • np.ptp(),数组沿指定轴返回最大值减去最小值,即(max-min)
  • np.std(),返回标准偏差(standard deviation)
  • np.var(),返回方差(variance)
  • np.cumsum(),返回累加值
  • np.cumprod(),返回累乘积值

请注意函数在使用时需要指定axis轴的方向,若不指定,默认统计整个数组。

创建ndarray

1.使用array函数,它接受一切序列型的对象,包括其他ndarray对象。(除非显式说明,np.array会尝试为新建的数组推断出较为合适的的数据类型)

>>> a = [1,2,1.1,3,4]
>>> arr_a = np.array(a)
>>> arr_a.dtype
dtype('float64')
>>> arr_a
array([ 1. ,  2. ,  1.1,  3. ,  4. ])
>>> b = ([1,2,3],(4,5,6,))
>>> arr_b = np.array(b)
>>> arr_b.dtype
dtype('int32')   #这个应该和解释器有关
>>> arr_b
array([[1, 2, 3],
       [4, 5, 6]])

2.zeros和ones也可以创建ndarray,empty可以创建一个没有任何具体值的数组(一般为垃圾值)。

>>> np.ones((2,3,2))
array([[[ 1.,  1.],
        [ 1.,  1.],
        [ 1.,  1.]],

       [[ 1.,  1.],
        [ 1.,  1.],
        [ 1.,  1.]]])
>>> np.zeros((2,2)).dtype
dtype('float64')
>>> 

没有特别指定,数据类型基本都是float64.
这里写图片描述

ndarray的数据类型

这里写图片描述这里写图片描述
显式的创建数组:

>>> x = np.array([1,2,3,4],dtype=np.float64)
>>> x
array([ 1.,  2.,  3.,  4.])
>>> y = x.astype(np.int64)  #显式的转换数据类型
>>> y
array([1, 2, 3, 4], dtype=int64)

注意:调用astype无论如何都会创建一个新的数组(原始数据的一份拷贝)。

数组和标量之间的运算

大小相等的数组之间的任何算数运算都会将运算应用到元素级。和标量的运算也会对每个元素进行运算。

>>> arr = np.array([[1,2,3],[4,5,6]])
>>> arr * arr
array([[ 1,  4,  9],
       [16, 25, 36]])
>>> 1/arr
array([[ 1.        ,  0.5       ,  0.33333333],
       [ 0.25      ,  0.2       ,  0.16666667]])      
>>> arr ** 0.5
array([[ 1.        ,  1.41421356,  1.73205081],
       [ 2.        ,  2.23606798,  2.44948974]])

大小不同的数组之间的运算叫做广播(broadcasting)。见后文。
如果想进行矩阵乘法的话可以用dot函数来运算。

>>> a = np.arange(12).reshape(3,4)
>>> b = np.arange(12).reshape(4,3)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> b
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>> np.dot(a,b)
array([[ 42,  48,  54],
       [114, 136, 158],
       [186, 224, 262]])

基本的索引和切片

和列表操作差不多。也有一个很重要的区别,数组切片是原始数组的视图,也就是说数据不会被复制,视图上的任何修改都会直接改变原始数据。

>>> arr
array([[1, 2, 3],
       [4, 5, 6]])
>>> arr[1]
array([4, 5, 6])
>>> arr[1] = 5 #这个就叫广播,自动传播到每一个数据
>>> arr[1]
array([5, 5, 5])
>>> arr
array([[1, 2, 3],
       [5, 5, 5]])
>>> arr = np.arange(36).reshape(3,3,4)
>>> arr
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]],

       [[24, 25, 26, 27],
        [28, 29, 30, 31],
        [32, 33, 34, 35]]])
>>> arr[1,2]  #还可以这么玩
array([20, 21, 22, 23])    

布尔型索引

>>> import numpy as np
>>> names = np.array(['Bob','Joe','Tom','Amy','Bob'])
>>> names
array(['Bob', 'Joe', 'Tom', 'Amy', 'Bob'], 
      dtype='<U3')
>>> names == 'Bob' #前面说过,会对每个元素进行运算
array([ True, False, False, False,  True], dtype=bool)
>>> data = np.arange(20).reshape(5,4)
>>> data
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
>>> data[names == 'Bob'] #布尔型索引
array([[ 0,  1,  2,  3],
       [16, 17, 18, 19]])
>>> mask = (names == 'Bob') or (names=='Tom') #and和or在布尔型数组中无效,要用 & 和 | 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> mask = (names == 'Bob') | (names=='Tom')
>>> mask
array([ True, False,  True, False,  True], dtype=bool)

堆叠数组

  • vstack(vertical stack)垂直堆叠
  • hstack(horizontal stack)水平堆叠
  • dstack 深度堆叠
  • column_stack 以列将一维数组合成二维数组,等同与 vstack 对一维数组。
  • row_stack 将一维数组以行组合成二维数组。
>>> a = np.arange(6).reshape(2,3)
>>> b = np.arange(7,13).reshape(2,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
>>> v_stack = np.vstack((a,b))
>>> h_stack = np.hstack((a,b))
>>> v_stack
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> h_stack
array([[ 0,  1,  2,  7,  8,  9],
       [ 3,  4,  5, 10, 11, 12]])
>>> np.dstack((a,b))  #自己体会
array([[[ 0,  7],
        [ 1,  8],
        [ 2,  9]],

       [[ 3, 10],
        [ 4, 11],
        [ 5, 12]]])
>>> con_stack = np.concatenate((a,b,a,b),axis=1)
>>> con_stack
array([[ 0,  1,  2,  7,  8,  9,  0,  1,  2,  7,  8,  9],
       [ 3,  4,  5, 10, 11, 12,  3,  4,  5, 10, 11, 12]])
>>> con_stack2 = np.concatenate((a,b,a,b),axis=0)
>>> con_stack2
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12],
       [ 0,  1,  2],
       [ 3,  4,  5],
       [ 7,  8,  9],
       [10, 11, 12]])

分割数组

  • split 指定轴分割,默认axis=0,即vsplit
  • array_split 可以进行不等分割
  • hsplit 水平分割
  • vsplit 垂直分割
  • dsplit 深度分割
>>> arr = np.arange(12).reshape(3,4)
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
>>> x,y = np.split(arr,2,axis=1) #必须能分割成相等大小的几块,不然会出错
>>> x
array([[0, 1],
       [4, 5],
       [8, 9]])
>>> y
array([[ 2,  3],
       [ 6,  7],
       [10, 11]])
>>> i,j,k = np.split(arr,3,axis=0)
>>> i
array([[0, 1, 2, 3]])
>>> j
array([[4, 5, 6, 7]])
>>> k
array([[ 8,  9, 10, 11]])

复制和视图

  1. 完全不拷贝(不拷贝的意思就是不复制数据,操作的是同一份数据)
    • 简单的赋值不拷贝数组对象或它们的数据。
    • 函数调用不拷贝数组

>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> b = a
>>> c = a
>>> d = c
>>> d is a #都是同一个对象,同一份数据
True
>>> b is a
True
>>> c is a
True
>>> def f(x):
...     x += x
... 
>>> b = f(a)
>>> a  #a会改变
array([[ 0,  2,  4],
       [ 6,  8, 10]])
  1. 视图(view)和浅复制

不同的数组对象分享同一个数据。视图方法创造一个新的数组对象指向同一数据。

>>> a
array([[0, 1, 2],
       [3, 4, 5]])
>>> c = a.view() #新的对象,但是共用同一份数据
>>> c
array([[0, 1, 2],
       [3, 4, 5]])
>>> c[0][0] = 100
>>> a
array([[100,   1,   2],
       [  3,   4,   5]])
>>> c
array([[100,   1,   2],
       [  3,   4,   5]])
>>> c is a  #不同的对象
False
  1. 深复制(完全复制数组和它的数据。)

这个复制方法完全复制数组和它的数据。

>>> a
array([[100,   1,   2],
       [  3,   4,   5]])
>>> b = a.copy() #b和a没有关系了
>>> b is a
False
>>> b[0][0] = 0
>>> b
array([[0, 1, 2],
       [3, 4, 5]])
>>> a
array([[100,   1,   2],
       [  3,   4,   5]])

函数和方法(method)总览

创建数组

arange, array, copy, empty, empty_like, eye, fromfile, fromfunction, identity, linspace, logspace, mgrid, ogrid, ones, ones_like, r , zeros, zeros_like

转换

astype, atleast 1d, atleast 2d, atleast 3d, mat

操作

array split, column stack, concatenate, diagonal, dsplit, dstack, hsplit, hstack, item, newaxis, ravel, repeat, reshape, resize, squeeze, swapaxes, take, transpose, vsplit, vstack

询问

all, any, nonzero, where

排序

argmax, argmin, argsort, max, min, ptp, searchsorted, sort

运算

choose, compress, cumprod, cumsum, inner, fill, imag, prod, put, putmask, real, sum

基本统计

cov, mean, std, var

基本线性代数

cross, dot, outer, svd, vdot

广播法则(rule)

广播法则能使通用函数有意义地处理不具有相同形状的输入。

广播第一法则是,如果所有的输入数组维度不都相同,一个“1”将被重复地添加在维度较小的数组上直至所有的数组拥有一样的维度。

广播第二法则确定长度为1的数组沿着特殊的方向表现地好像它有沿着那个方向最大形状的大小。对数组来说,沿着那个维度的数组元素的值理应相同。

应用广播法则之后,所有数组的大小必须匹配。更多细节可以从这个 文档 找到。

花式索引

比较花,用到的时候再学。

参考链接:

  1. http://www.tuicool.com/articles/r2yyei
  2. https://docs.scipy.org/doc/numpy-dev/user/quickstart.html
  3. https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/
  4. http://www.cnblogs.com/lemonbit/p/7043879.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章