1、导入Numpy

import numpy as np

2、向量相加

def numpysum(n):
    a = np.arange(n)**2
    b = np.arange(n)**3
    c = a + b
    return c
print(numpysum(20))

输出:

[   0    2   12   36   80  150  252  392  576  810 1100 1452 1872 2366
 2940 3600 4352 5202 6156 7220]

3、Numpy数组

a = np.arange(5)
print(a.dtype)#查看类型
print(a.shape)#查看维度

#创建多维数组
m = np.array([np.arange(2),np.arange(2)])
print(m)
print(m.shape)#查看维度
print(m.dtype)#查看类型

#创建0数组或者空数组
print(np.zeros(10))#创建全是0的数组
print(np.zeros((3,6)))#创建全是0的多维数组
print(np.empty((2,3,2)))#创建随机值的数组
print(np.arange(15))#创建普通数组

#选取数组元素
a = np.array([[1,2],[3,4]])#生成二维数组
print(a)
print(a[0,0])#选取0行0列的元素
print(a[0,1])#选取0行0列的元素
print(a[1,0])#选取1行0列的元素
print(a[1,1])#选取1行1列的元素

输出:

int64
(5,)
[[0 1]
 [0 1]]
(2, 2)
int64
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0.]]
[[[0. 0.]
  [0. 0.]
  [0. 0.]]

 [[0. 0.]
  [0. 0.]
  [0. 0.]]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14]
[[1 2]
 [3 4]]
1
2
3
4

4、Numpy数据类型

print(np.float64(42))#64位浮点数
print(np.int8(42.0))#8位整数
print(np.bool(42))#布尔型
print(np.float(True))
print(np.float(False))

输出:

42.0
42
True
1.0
0.0

5、数据类型转换

arr = np.array([1,2,3,4,5])#生成一维数组
print(arr.dtype)#查看类型
float_arr = arr.astype(np.float64)#转换为64位浮点数类型
print(float_arr.dtype)#重新查看数据类型

arr = np.array([3.7,-1.2,-2.6,0.5,12.9,10.11])
print(arr)
print(arr.astype(np.int32))#将浮点数转换为32位整数类型

输出:

int64
float64
[ 3.7  -1.2  -2.6   0.5  12.9  10.11]
[ 3 -1 -2  0 12 10]

6、创建自定义数据类型

t = np.dtype([('name',np.str_,40),('numitems',np.int32),('price',np.float32)])
print(t)
itemz = np.array([('Meaning of life',42,3.14),('Butter',13,2.72)],dtype=t)
print(itemz)

输出:

[('name', '<U40'), ('numitems', '<i4'), ('price', '<f4')]
[('Meaning of life', 42, 3.14) ('Butter', 13, 2.72)]

7、数组与标量运算

arr = np.array([[1,2,3],[4,5,6]])
print(arr)#输出数组
print(arr*arr)#数组平方
print(arr-arr)#数组相减
print(1/arr)#数组倒数
print(arr**0.5)#数组开根号

输出:

[[1 2 3]
 [4 5 6]]
[[ 1  4  9]
 [16 25 36]]
[[0 0 0]
 [0 0 0]]
[[1.         0.5        0.33333333]
 [0.25       0.2        0.16666667]]
[[1.         1.41421356 1.73205081]
 [2.         2.23606798 2.44948974]]

8、一维数组的索引和切片

a=np.arange(9);
print(a[:7:2])#选取(0,6),隔两个选取
print(a[3:7])#选取(3,6)
print(a[::-1])#从末尾到头逐一选取

s = slice(3,7,2)#另一种切片方式
print(a[s])

s=slice(None, None, -1)#从末尾到头逐一选取
print(a[s])

输出:

[0 2 4 6]
[3 4 5 6]
[8 7 6 5 4 3 2 1 0]
[3 5]
[8 7 6 5 4 3 2 1 0]

9、多维数组的索引和切片

b= np.arange(24).reshape(2,3,4)#创建一个三维数组
print(b.shape)#查看维度
print(b)

print(b[0,0,0])#获得0层0行0列的数据
print(b[:,0,0])#获得每一层0行0列的数据
print(b[0])#获得0层的数据
print(b[0,:,:])#获得0层的数据
print(b[0,...])#获得0层的数据
print(b[0,1])#获得0层1行的数据
print(b[0,1,::2])#获得0层1行每一列的数据,逐2选取

输出:

(2, 3, 4)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
0
[ 0 12]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[4 5 6 7]
[4 6]

10、布尔型索引

names=np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])#布尔型数组
data=np.random.randn(7,4)#生成二维的正态分布数据
print(names)
print(data)
print(names == 'Bob')#查看names数组中的每一个元素是否为Bob返回一个布尔型数组
print(data[names == 'Bob'])#显示数组中为True的行
print(data[names == 'Bob',2:])
print(names != 'Bob')#查看names数组中的每一个元素是否为Bob返回一个布尔型数组
mask = (names == 'Bob') | (names == 'Will')#查看names数组中的每一个元素是否为Bob或Will返回一个布尔型数组
print(mask)
print(data[mask])

data[data < 0] = 0#将数组中小于0的数修改为0
print(data)

data[names != 'Joe'] = 7#将数组中对应Joe的数据修改为7
print(data)

输出:

['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[-0.89498016  0.03578746  0.71418906  0.57328738]
 [ 0.0876254  -0.85631281  1.61239416 -0.06831931]
 [ 1.1253243   0.99034735 -2.87970075 -1.26387147]
 [-0.54600228 -0.35791835 -0.12434706  0.66510069]
 [ 1.389508   -0.21656564 -0.42991166 -0.12690249]
 [ 0.09737544  0.37900011 -0.34413172  0.74143428]
 [-1.2138582   0.23140315  0.51983695  0.91618095]]
[ True False False  True False False False]
[[-0.89498016  0.03578746  0.71418906  0.57328738]
 [-0.54600228 -0.35791835 -0.12434706  0.66510069]]
[[ 0.71418906  0.57328738]
 [-0.12434706  0.66510069]]
[False  True  True False  True  True  True]
[ True False  True  True  True False False]
[[-0.89498016  0.03578746  0.71418906  0.57328738]
 [ 1.1253243   0.99034735 -2.87970075 -1.26387147]
 [-0.54600228 -0.35791835 -0.12434706  0.66510069]
 [ 1.389508   -0.21656564 -0.42991166 -0.12690249]]
[[0.         0.03578746 0.71418906 0.57328738]
 [0.0876254  0.         1.61239416 0.        ]
 [1.1253243  0.99034735 0.         0.        ]
 [0.         0.         0.         0.66510069]
 [1.389508   0.         0.         0.        ]
 [0.09737544 0.37900011 0.         0.74143428]
 [0.         0.23140315 0.51983695 0.91618095]]
[[7.         7.         7.         7.        ]
 [0.0876254  0.         1.61239416 0.        ]
 [7.         7.         7.         7.        ]
 [7.         7.         7.         7.        ]
 [7.         7.         7.         7.        ]
 [0.09737544 0.37900011 0.         0.74143428]
 [0.         0.23140315 0.51983695 0.91618095]]

11、数组转置

arr = np.arange(15).reshape((3,5))
print(arr)
print(arr.T)#数组转置

输出:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
[[ 0  5 10]
 [ 1  6 11]
 [ 2  7 12]
 [ 3  8 13]
 [ 4  9 14]]

12、改变数组的维度

arr = np.arange(20).reshape((4,5))#将数组变为4*5的数组
print(arr)
print(arr.flatten())#将数组变回一维数组
print(arr.ravel())#将数组变回一位数组
arr.shape = (2,5,2)#将数组变为2*5*2的数组
print(arr)

输出:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]
[[[ 0  1]
  [ 2  3]
  [ 4  5]
  [ 6  7]
  [ 8  9]]

 [[10 11]
  [12 13]
  [14 15]
  [16 17]
  [18 19]]]

13、组合数组

a = np.arange(9).reshape(3,3)
b = 2*a
#水平组合
print(np.hstack((a,b)))
print(np.concatenate((a,b),axis=1))
#垂直组合
print(np.vstack((a,b)))
print(np.concatenate((a,b),axis=0))
#深度组合
print(np.dstack((a,b)))

输出:

[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
[[ 0  1  2  0  2  4]
 [ 3  4  5  6  8 10]
 [ 6  7  8 12 14 16]]
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 0  2  4]
 [ 6  8 10]
 [12 14 16]]
[[[ 0  0]
  [ 1  2]
  [ 2  4]]

 [[ 3  6]
  [ 4  8]
  [ 5 10]]

 [[ 6 12]
  [ 7 14]
  [ 8 16]]]

14、数组的分割

a = np.arange(9).reshape(3,3)
print(np.hsplit(a,3))#水平分割
print(np.split(a,3,axis=1))#axis=1代表水平分割

print(np.vsplit(a,3))#垂直分割
print(np.split(a,3,axis=0))#axis=0代表垂直分割

输出:

[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
[array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

15、数组的转换

b=np.arange(24).reshape(2,12)#创建一个2*12的数组
print(b.ndim)#二维数组的维数
print(b.size)#数组中元素的总个数

b = np.array([1+1j,3+2j])#创建一个复数数组
print(b.real)#实部
print(b.imag)#虚部

b = np.array([1+1j,2+3j])
print(b.tolist())#转换为python的列表
print(b.astype(int))#转换为整数类型
print(b.astype(complex))#转换为复数类型

输出:

2
24
[1. 3.]
[1. 2.]
[(1+1j), (2+3j)]
导入Numpy.py:190: ComplexWarning: Casting complex values to real discards the imaginary part
  print(b.astype(int))#转换为整数类型
[1 2]
[1.+1.j 2.+3.j]

17、利用数组进行数据处理

points = np.arange(-5,5,0.01)
xs, ys = np.meshgrid(points,points)  #分别进行赋值
print(xs)
print(ys)

import matplotlib.pyplot as plt#导入一个画图库
z=np.sqrt(xs**2+ys**2)
print(z)
plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
plt.title("Image plot of gray")
plt.draw()

输出:

[[-5.   -4.99 -4.98 ...  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...  4.97  4.98  4.99]
 ...
 [-5.   -4.99 -4.98 ...  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...  4.97  4.98  4.99]
 [-5.   -4.99 -4.98 ...  4.97  4.98  4.99]]
[[-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]]
[[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]]

18、将条件逻辑表达为数组运算

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=np.where(cond,xarr,yarr)  #如果是True就选择xarr,如果是False就选择yarr
print(result)

arr=randn(4,4)
result=np.where(arr>0,2,-2) #如果大于0就选择2,如果小于0就是-2
print(result)
result=np.where(arr>0,2,arr)
print(result)#如果为False就保持不变

输出:

[1.1 2.2 1.3 1.4 2.5]
[[-2 -2  2 -2]
 [ 2 -2  2  2]
 [-2  2 -2 -2]
 [-2 -2  2  2]]
[[-0.47404412 -0.11554679  2.         -0.42080318]
 [ 2.         -1.1289591   2.          2.        ]
 [-0.68071913  2.         -0.85447793 -1.88544569]
 [-0.76910235 -0.38743575  2.          2.        ]]

19、数学与统计方法

arr=randn(5,4)
print(arr.mean())#求均值
print(arr.sum()) #求和

arr=np.array([[0,1,2],[3,4,5],[6,7,8]])
print(arr)
print(arr.cumsum(1))#计算累计和   0的话行累加,1的话列累加
print(arr.cumprod(1))#计算累计积

输出:

-0.053154566978182424
-1.0630913395636485
[[0 1 2]
 [3 4 5]
 [6 7 8]]
[[ 0  1  3]
 [ 3  7 12]
 [ 6 13 21]]
[[  0   0   0]
 [  3  12  60]
 [  6  42 336]]

20、用于布尔型数组的方法

arr=randn(100)
print((arr > 0).sum()) #正值的数量

bools = np.array([False,False,True,False])
print(bools.any())  #是否存在一个为真
print(bools.all())  #是否都是真的

输出:

49
True
False

21、数组排序

arr=randn(8)
arr.sort()#数组进行排序
print(arr)

arr=randn(5,3)
arr.sort(1)#按照行进行排序
print(arr)

输出:

[-1.05821903 -0.65934725 -0.37487126 -0.2697983   0.18288892  0.26701018
  0.61696946  1.21626008]
[[-0.97246304 -0.50366913 -0.41047398]
 [-0.08976144  0.18760282  0.27115414]
 [ 0.02481582  0.3926402   1.0356398 ]
 [-1.18880822 -0.53055481 -0.19173486]
 [ 0.67551174  0.93808397  0.99299003]]

22、唯一化以及其他的逻辑集合

names=np.array(['Bob','Joe','Will','Bob','Joe'])
print(np.unique(names))  #返回唯一一个元素
ints = np.array([3,3,2,1,4,5,1,3,2])
print(np.unique(ints))

values=np.array([6,0,0,3,2,5,6])
print(np.in1d(values,[2,3,6]))  #一个数组中的元素是否在另一个数组里面

输出:

['Bob' 'Joe' 'Will']
[1 2 3 4 5]
[ True False False  True  True False  True]

23、线性代数的运用

x=np.array([[1,2,3],[4,5,6]])
y=np.array([[6,23],[-1,7],[8,9]])
print(x.dot(y)) #矩阵相乘

输出:

[[ 28  64]
 [ 67 181]]

24、随机数的生成

samples = np.random.normal(size=(4,4)) #4*4的随机数服从正态分布
print(samples)

输出:

[[ 2.3594308  -0.16679891  0.61071828 -1.43154398]
 [ 0.65029184  0.5375564   0.3557022  -1.282127  ]
 [-0.17028982 -1.68308221 -0.32151961  0.32609419]
 [ 1.11233366 -1.0175448  -1.10387852  0.64077613]]

本文链接:http://nix.pub/article/numpy/