python-pandas-numpy DAY_15(1)

Numpy简介:
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。numpy内置了并行运算功能,当系统有多个核心时,做某种计算时,numpy会自动做并行计算。Numpy底层使用C语言编写,数组中直接存储对象,而不是存储对象指针,所以其运算效率远高于纯Python代码。
今日学习:
1.numpy的基本操作
重点:
1.基本指令
numpy是python的一个库,使用之前先导入

import numpy as np#导入np包

a = np.array([[1, 2, 3], [4, 5, 6], [1, 2, 3]], dtype=np.int)#创建数组
print(a)
print("矩阵的维数:{}".format(a.ndim))
print("矩阵的行和列的个数分别为:{}".format(a.shape))
print("矩阵的元素数为:{}".format(a.size))
b = np.zeros((3, 3))#产生全零(3,3)数列
print(b)
c = np.empty((3, 3))#产生(3,3)空数列
print(c)
d = np.arange(1, 12, 2)#从1到12,步长为2,所有元素组成一个数列
print(d)
e = np.linspace(1, 10, 20)#产生一个线段,从1到10,一共20个元素
print(e)

结果如下

[[1 2 3]
 [4 5 6]
 [1 2 3]]
矩阵的维数:2
矩阵的行和列的个数分别为:(3, 3)
矩阵的元素数为:9
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]
[ 1  3  5  7  9 11]
[ 1.          1.47368421  1.94736842  2.42105263  2.89473684  3.36842105
  3.84210526  4.31578947  4.78947368  5.26315789  5.73684211  6.21052632
  6.68421053  7.15789474  7.63157895  8.10526316  8.57894737  9.05263158
  9.52631579 10.        ]

对于arange和linspace功能可以使用reshape功能

d = np.arange(12).reshape((3,4))
print(d)
e = np.linspace(1, 10, 20).reshape((4,5))
print(e)

结果如下

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 1.          1.47368421  1.94736842  2.42105263  2.89473684]
 [ 3.36842105  3.84210526  4.31578947  4.78947368  5.26315789]
 [ 5.73684211  6.21052632  6.68421053  7.15789474  7.63157895]
 [ 8.10526316  8.57894737  9.05263158  9.52631579 10.        ]]

注意,这个过程中一定要做到行数乘以列数等于元素数,不然无法重新排列
2.基础运算

b = np.random.random((3, 3))#随机产生一个3*3的矩阵
import numpy as np

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

print(a.dot(b))#print(np.dot(a,b))
print(a * b)
[[ 22  28  43]
 [ 49  64 100]
 [ 22  28  43]]#输出的是矩阵乘法
[ 1  4 12]
 [12 20 36]
 [ 5 12 27]]#输出算数乘法,返回对应位的乘法数值

注意区分不同乘法的应用

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [1, 2, 3]], dtype=np.int)
b = np.array([[1, 2, 4],
              [3, 4, 6],
              [5, 6, 9]])
print(a+b)
print(a-b)
print(np.dot(a,a))
print(a**2)

结果如下

[[ 2  4  7]
 [ 7  9 12]
 [ 6  8 12]]
[[ 0  0 -1]
 [ 1  1  0]
 [-4 -4 -6]]
[[12 18 24]
 [30 45 60]
 [12 18 24]]#注意区分平方和自身距真相乘的区别
[[ 1  4  9]
 [16 25 36]
 [ 1  4  9]]

3.求极限的操作

import numpy as np

a = np.array([[1, 2, 3],
              [4, 5, 6],
              [1, 2, 3]], dtype=np.int)
b = np.array([[1, 2, 4],
              [3, 4, 6],
              [5, 6, 9]])
print(np.sum(a))
print(np.max(b))
print(np.sum(a,axis=1))#**axis=1代表在行进行操作,一共三行,返回三个值**
print(np.min(b,axis=0))#**axis=0代表在列进行操作,一共三列,返回三列每一列的最小值**

结果如下

27
9
[ 6 15  6]
[1 2 4]

4.其他操作

import numpy as np

a = np.array([[7, 7, 3],
              [4, 9, 6],
              [5, 2, 3]], dtype=np.int)
print(np.argmax(a))#最大值索引
print(np.argmin(a))#最小值索引
print(np.mean(a))#平均值
print(np.average(a))#平均值
print(np.median(a))#中间值
print(np.cumsum(a))#逐个相加
print(np.diff(a))#累差
print(np.sort(a))#逐行排序
print(np.transpose(a))#转置
print(a.T)#转置
print(np.clip(a,3,5))#所有小于3的数都变成3,所有大于5的数变成5,其他保留

5.循环操作
距真的每一行都可以看成一个列表,可以生成迭代器,并进行迭代循环

import numpy as np

a = np.array([[7, 7, 3],
              [4, 9, 6],
              [5, 2, 3]], dtype=np.int)
print(a[1, 1])#输出下标(1,1)的元素
print(a[1][1])#输出下标(1,1)的元素
print(a[:2][1:2])#可执行列表的操作
for row in a:
    print(row)#循环输出行
for col in a.T:
    print(col)#循环输出列
for item in a.flat:
    print(item, end=" ")#循环输出所有元素,flat语句很重要

这里补充一个flatten语句

import numpy as np

a = np.array([[7, 7, 3],
              [4, 9, 6],
              [5, 2, 3]], dtype=np.int)
print(a.flatten())

结果如下

[7 7 3 4 9 6 5 2 3]

可以看出flatten输出所有元素,按行输出,返回一个列表

6.numpy array 合并

import numpy as np

a = np.array([7, 7, 3])[:,np.newaxis]#将行变成列
b = np.array([4, 9, 6])[:,np.newaxis]#将行变成列

print(a)
print(b)

结果如下

[[7]
 [7]
 [3]]
[[4]
 [9]
 [6]]
import numpy as np

a = np.array([7, 7, 3])
b = np.array([4, 9, 6])

print(np.vstack((a, b)))#上下合并
print(np.hstack((a, b)))#左右合并
print(np.concatenate((a, b, a), axis=0))#多个合并,axis=0代表在行操作

7.numpy array的分割

import numpy as np

a = np.arange(12).reshape((3,4))
print(a)
print(np.split(a,3,axis=0))#把a按行分成3行
print(np.split(a,4,axis=1))#把a按列分成4列,
print(np.array_split(a,3,axis=1))#把a按列分成三部分(不等分割)

结果如下

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

对于vstack和hstack对于vsplite和hsplit

import numpy as np

a = np.arange(12).reshape((3, 4))
print(a)
print(np.hsplit(a, 4))
print(np.vsplit(a, 3))#必须分割成整数列或行

结果如下

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

8.numpy copy和deep copy
在之前python的学习过程中,我们知道列表支持原位改变,如果a=[1,2,3]
b=a,我们改变啊a[0]=2,那么a=b=[2,2,3]
同理矩阵里面也是类似,这时候就需要我们使用copy功能,防止改变

import numpy as np
a = np.arange(12).reshape((3, 4))
b = a
a
Out[9]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
b
Out[10]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a[0][0]=10
a
Out[12]: 
array([[10,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
b
Out[13]: 
array([[10,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

防止改变,我们使用copy功能

c=a.copy()
a[0][0]=5
a
Out[16]: 
array([[ 5,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
c
Out[17]: 
array([[10,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
d=a[:][:]
a[0][0]=3
a
Out[20]: 
array([[ 3,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
d
Out[21]: 
array([[ 3,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
a[0][0]=7
d
Out[23]: 
array([[ 7,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

我们发现在列表中赋值的[:]功能在矩阵中赋值也会使对应值改变,所以在矩阵操作中只能使用copy

发布了33 篇原创文章 · 获赞 0 · 访问量 690

猜你喜欢

转载自blog.csdn.net/soulproficiency/article/details/104067466