Python初学小知识(十一):NumPy

十五、NumPy

NumPy是一个高性能的科学计算和数据分析基础包,它具有多维数组对象、线性代数、傅里叶变换和随机数等强大功能。

1. 多维数组

1.1 创建多维数组

import numpy as np  #平时的使用中,习惯将import numpy写成import numpy as np
np.array([1, 2, 3])
>>> array([1, 2, 3])
np.array([[1, 2, 3], [4, 5, 6]])
>>>     array([[1, 2, 3],
        	   [4, 5, 6]])
np.zeros([2, 3]), np.ones([2, 3]), np.ones((2, 3))  #里面的维度使用列表或者元组形式都行
>>>     (array([[0., 0., 0.],
    	        [0., 0., 0.]]),
  	     array([[1., 1., 1.],
       	        [1., 1., 1.]]),
  	     array([[1., 1., 1.],
       	        [1., 1., 1.]]))
a = np.ones([2, 3])
a[1, 2] = 2
a
>>>     array([[1., 1., 1.],
     	      [1., 1., 2.]])
np.empty([1, 2]), np.empty([2, 3], dtype=int)
>>>     (array([[1.76971408e-171, 1.74931728e+009]]),
  	     array([[-1809049168,         564,           0],
         	    [          0,           1,     7471207]]))
np.arange(2000)
>>> array([   0,    1,    2, ..., 1997, 1998, 1999])

1.2 多维数组的常用属性

#adim返回维度数量
a = np.array([1, 2])
b = np.array([[1, 2, 3], [4, 5, 6]])
c = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [0, 0, 0]]])
print(a.ndim, b.ndim, c.ndim)  #其实就是有几个中括号
>>> 1 2 3
#shape返回维度值
print(c)
print(a.shape, b.shape, c.shape)
>>>     [[[1 2 3]
  	      [4 5 6]]
    
  	    [[7 8 9]
   	     [0 0 0]]]
 	    (2,) (2, 3) (2, 2, 3)
#size返回元素总数量
print(a.size, b.size, c.size)
>>> 2 6 12
#dtype返回数据类型
d = np.ones((2, 3))
a.dtype, d.dtype
>>> (dtype('int32'), dtype('float64'))
d = np.ones((2, 3), dtype = int)
e = np.ones((2, 3), dtype = np.int32)
d.dtype, e.dtype  #更改数据类型的写法,如果是改为int32,就有两种,int默认是int32
>>> (dtype('int32'), dtype('int32'))
#itemsize返回字节大小
e.itemsize  #32/8=4
>>> 4

2. 多维数组的基本操作

2.1 算术运算

a = np.array([4, 5, 6])
b = np.array([1, 2, 3])
a + b, a - b, a * b, a / b, a % b, a ** b
(array([5, 7, 9]),
 array([3, 3, 3]),
 array([ 4, 10, 18]),
 array([4. , 2.5, 2. ]),
 array([0, 1, 0], dtype=int32),
 array([  4,  25, 216], dtype=int32))
#矩阵运算
a.dot(b), np.dot(a, b)
>>> (32, 32)
#数组直接和标量运算
a + 2, a - 2, a * 2, a / 2, a % 2, a ** 2
(array([6, 7, 8]),
 array([2, 3, 4]),
 array([ 8, 10, 12]),
 array([2. , 2.5, 3. ]),
 array([0, 1, 0], dtype=int32),
 array([16, 25, 36], dtype=int32))

2.2 自身运算

x = np.array([1, 2, 3])
x.min(), x.max(), x.sum()
>>> (1, 3, 6)
#axis=0时,按列计算,保留行
x = np.array([[1, 5, 6], [4, 2, 3]])
print(x.min(), x.min(axis=0), x.min(axis=1))
print(x.max(), x.max(axis=0), x.max(axis=1))
print(x.sum(), x.sum(axis=0), x.sum(axis=1))
1 [1 2 3] [1 2]
6 [4 5 6] [6 4]
21 [5 7 9] [12  9]
#指数运算,平方根运算,二次方运算
x = np.array([1, 2, 3])
np.exp(x), np.sqrt(x), np.square(x)
(array([ 2.71828183,  7.3890561 , 20.08553692]),
 array([1.        , 1.41421356, 1.73205081]),
 array([1, 4, 9], dtype=int32))

2.3 随机数组

np.random.seed(42)  #随机数生成器的随机因子,之后无论运行多少次程序,生成的数据都是一样的

'''生成随机样本数'''
np.random.rand(2, 3)  #[0, 1)范围内,均匀分布
>>> array([[0.37454012, 0.95071431, 0.73199394],
           [0.59865848, 0.15601864, 0.15599452]])
np.random.randn(2, 3)  #均值为0,方差为1的正态分布
>>> array([[ 1.57921282,  0.76743473, -0.46947439],
           [ 0.54256004, -0.46341769, -0.46572975]])
np.random.randint(1, 60)  #生成一个1和60之间的随机整数
>>> 25
np.random.binomial(10, 0.6, 100)  #10个样本数,每个样本成功的概率是0.6,测试了100次
#从具有指定参数,n次试验和p个成功概率的二项式分布中抽取样本,其中n个整数> = 0,且p在[0,1]区间内。
#(n可以作为浮点输入,但在使用中会被截断为整数)
array([8, 4, 7, 3, 7, 7, 5, 5, 6, 6, 5, 7, 2, 3, 5, 7, 5, 8, 9, 7, 6, 4,
       5, 5, 6, 7, 7, 3, 9, 4, 6, 6, 5, 6, 4, 4, 6, 7, 6, 4, 7, 6, 6, 5,
       8, 5, 4, 7, 7, 3, 7, 4, 6, 7, 4, 6, 6, 7, 6, 8, 6, 3, 7, 5, 7, 5,
       8, 3, 6, 7, 8, 7, 6, 7, 5, 6, 7, 6, 5, 8, 7, 9, 5, 5, 6, 4, 5, 6,
       4, 7, 8, 7, 8, 6, 4, 9, 8, 6, 4, 7])
np.random.beta(1, 10)  #指定维度且满足beta分布
>>> 0.03929334089516656
np.random.normal(1, 10)  #指定维度且满足高斯正态分布
>>> -0.3958962815517375

2.4 索引、切片和迭代

x = np.arange(10)
x, x[:5]
>>> (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([0, 1, 2, 3, 4]))
x = np.array([[1,2,3], 
              [4,5,6], 
              [7,8,9]])

x[1], x[0:2, 1:3]#第0行、第1行,第1列、第2列
(array([4, 5, 6]),
 array([[2, 3],
        [5, 6]]))
#针对不同维度进行迭代
for i in x:
    print(i)
[1 2 3]
[4 5 6]
[7 8 9]
for i in x:
    for j in i:
        print(j)
1
2
3
4
5
6
7
8
9
#上面的迭代可以扁平化处理
for i in x.flat:
    print(i)
1
2
3
4
5
6
7
8
9

版权声明:本文为niexinyu0026原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。