numpy -- 基本操作


有一个捉迷藏社团,他们团长现在还没找到


参考翻译

官网 Quickstart tutorial


Array Creation

numpy 生成 Array 会返回一个 ndarray 对象

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])  # 直接生成
>>> a
array([[1, 2, 3],
       [4, 5, 6]])

>>> b = np.arange(1,10,2)  # 随机生成,1-10 步长为 2
>>> b
array([1, 3, 5, 7, 9])

>>> c = np.arange(15)    # 默认 0-15 步长为 1
>>> c
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])


>>> c = np.arange(15).reshape(3,5)  # 更改维度为 3*5
>>> c
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])


>>> d = np.zeros((2,3))  # 生成元素全为 0 的 2*3 
>>> d
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])

>>> e = np.ones((2,3,4)) # 生成元素全为 1 的三维矩阵
>>> e
array([[[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]],

       [[ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.]]])


>>> f = np.linspace(1,10,3)  # 生成 1-10 含 3 个元素的等差数列
>>> f
array([  1. ,   5.5,  10. ])


>>> g = np.logspace(1,10,3)  # 生成1-10 含 3 个元素的等比数列
>>> g
array([  1.00000000e+01,   3.16227766e+05,   1.00000000e+10])

>>> s = "hello"         # 按照字符 ACSII 码生成矩阵
>>> h = np.fromstring(s,dtype=np.int8)
>>> h
array([104, 101, 108, 108, 111], dtype=int8)

# 自定义结构体矩阵
>>> person = np.dtype({'names':['name','age'],'formats':['S32','i']})
>>> person
dtype([('name', 'S32'), ('age', '<i4')])
>>> j = np.array([('zhang',21)],dtype=person)
>>> j
array([(b'zhang', 21)],
      dtype=[('name', 'S32'), ('age', '<i4')])

ndarray 属性

>>> a = np.arange(15).reshape((3,5))
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> a.shape
(3, 5)
>>> a.ndim
2
>>> a.dtype
dtype('int32')
>>> a.size
15
>>> type(a)
<class 'numpy.ndarray'>

基本运算

记过运算之后,生成的结果会存放在一个新的 ndarray 对象中,原矩阵不会被改变,除非你重新对他赋值了

>>> a = np.array( [20,30,40,50] )
>>> b = np.arange( 4 )
>>> b
array([0, 1, 2, 3])
>>> c = a - b
>>> c
array([20, 29, 38, 47])
>>> b**2
array([0, 1, 4, 9], dtype=int32)
>>> np.sin(a)
array([ 0.91294525, -0.98803162,  0.74511316, -0.26237485])
>>> a<35
array([ True,  True, False, False], dtype=bool)

a*b表示的是矩阵对应元素的乘法,不是矩阵乘法,矩阵乘法使用 dot 来实现

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

>>> a.dot(b)
array([[5, 4],
       [3, 4]])

>>> np.dot(a,b)
array([[5, 4],
       [3, 4]])

一些运算,比如*=+=,会修改原来的矩阵而不是新增一个

>>> a
array([[1, 1],
       [0, 1]])

>>> a *= 3

>>> a
array([[3, 3],
       [0, 3]])

Universal Functions

基本方法如下所示,一般都可以见名知意

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

Shape Manipulation

Changing the shape of an array

下面的方法返回一个新的矩阵

>>> a = np.arange(15).reshape((3,5))
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

>>> a.ravel()  # 将所有元素展成一维数组
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

>>> a.T     # 反转
array([[ 0,  5, 10],
       [ 1,  6, 11],
       [ 2,  7, 12],
       [ 3,  8, 13],
       [ 4,  9, 14]])

>>> a.reshape(15,1)  # 重整
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11],
       [12],
       [13],
       [14]])

>>> a   # 原矩阵不发生变化
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

合并矩阵

In [2]: import numpy as np

In [3]: a = np.floor(10*np.random.random((2,2)))

In [4]: a
Out[4]:
array([[ 7.,  8.],
       [ 7.,  5.]])

In [5]: b = np.floor(10*np.random.random((2,2)))

In [6]: b
Out[6]:
array([[ 5.,  0.],
       [ 1.,  2.]])

垂直合并

In [7]: np.vstack((a,b))   # 垂直合并
Out[7]:
array([[ 7.,  8.],
       [ 7.,  5.],
       [ 5.,  0.],
       [ 1.,  2.]])

水平合并

In [8]: np.hstack((a,b))
Out[8]:
array([[ 7.,  8.,  5.,  0.],
       [ 7.,  5.,  1.,  2.]])

切分矩阵

In [9]: a = np.floor(10*np.random.random((2,12)))

In [10]: a
Out[10]:
array([[ 8.,  2.,  2.,  5.,  4.,  4.,  8.,  0.,  1.,  6.,  4.,  2.],
       [ 4.,  8.,  4.,  3.,  7.,  1.,  0.,  8.,  3.,  5.,  2.,  6.]])

平均切割为 3 列

In [11]: np.hsplit(a,3)
Out[11]:
[array([[ 8.,  2.,  2.,  5.],
        [ 4.,  8.,  4.,  3.]]), array([[ 4.,  4.,  8.,  0.],
        [ 7.,  1.,  0.,  8.]]), array([[ 1.,  6.,  4.,  2.],
        [ 3.,  5.,  2.,  6.]])]

第 3、4 列为界限分开

In [12]: np.hsplit(a,(3,4))
Out[12]:
[array([[ 8.,  2.,  2.],[ 4.,  8.,  4.]]), 
  array([[ 5.],[ 3.]]), 
  array([[ 4.,  4.,  8.,  0.,  1.,  6.,  4.,  2.],
        [ 7.,  1.,  0.,  8.,  3.,  5.,  2.,  6.]])]

总结

上面所记录的差不多可以应付基本的使用了,简单查阅