文章目录
1、统计nan值出现次数
numpy 中的nan为not a number,表示一个不确定的数,所以两个nan是不相等的。
可以使用count_nonzero函数实现
import numpy as np
data=np.array([1,2,3,np.nan])
nan_num=np.count_nonzero(data!=data)
print(nan_num)
代码运行结果:
参考自关于numpy的nan值处理
2、替换值
比如说想把某一列的2替换成3,pandas里面可以用map(dict)替换,numpy可以用bool值替换,代码如下:
>>> import numpy as np
>>> a=np.array([2,2,4,5,4])
>>> print(a)
[2 2 4 5 4]
>>> a[a==2]=3
>>> print(a)
[3 3 4 5 4]
>>>
3、提取矩阵的一行或一列
这个操作是根据切片实现的(和python中list的切片操作类似),可以根据需要提取多行和多列。
>>> import numpy as np
>>> a=np.random.randint(25,size=(3,3))
>>> a
array([[11, 6, 9],
[18, 14, 8],
[ 4, 3, 5]])
>>>
# 提取第2列
>>> a[:,1]
array([ 6, 14, 3])
#提取第2、3列
>>> a[:,1:]
array([[ 6, 9],
[14, 8],
[ 3, 5]])
#提取一行和多行
>>> a[1,:]
array([18, 14, 8])
>>> a[1:,:]
array([[18, 14, 8],
[ 4, 3, 5]])
参考博客:
Python numpy 提取矩阵的某一行或某一列
4、numpy增删改查
4.1 查和改
numpy既可以改变单个值,也可以改变多个值(某行、某列或者某个范围),改变多个值的时候,要注意赋值行列数和要替换的内容行列相同。
>>> a
array([[11, 6, 9],
[18, 14, 8],
[ 4, 3, 5]])
#改变单个值
>>> a[0][0]=1
>>> a
array([[ 1, 6, 9],
[18, 14, 8],
[ 4, 3, 5]])
# 改变第一行的值
>>> a[0,:]=[1,2,3]
>>> a
array([[ 1, 2, 3],
[18, 14, 8],
[ 4, 3, 5]])
# 改变第一行后面两个值
>>> a[0,1:3]=[4,5]
>>> a
array([[ 1, 4, 5],
[18, 14, 8],
[ 4, 3, 5]])
>>>
4.2 增
因为比较懒,那就一个函数解决吧。
numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting="same_kind")
参数几乎在前面都能找到,不再赘述,直接给出几个示例:
>>> a
array([[3, 0],
[3, 2],
[3, 3]])
>>> c
array([[1, 1],
[1, 1],
[1, 1]])
#添加列
>>> np.concatenate((a,c),axis=1)
array([[3, 0, 1, 1],
[3, 2, 1, 1],
[3, 3, 1, 1]])
#添加行
>>> np.concatenate((a,c),axis=0)
array([[3, 0],
[3, 2],
[3, 3],
[1, 1],
[1, 1],
[1, 1]])
#一维添加
>>> np.concatenate((a,c),axis=None)
array([3, 0, 3, 2, 3, 3, 1, 1, 1, 1, 1, 1])
>>>
几乎能满足所有需求。
4.3 删
5、numpy随机数
numpy1.17版本后对随机数生成提供了新方法,我自己总结了篇博客,numpy1.1.7版本后随机数新的生成方法总结,传统的随机数的生成方法,可以查看这篇博客Python的numpy库中rand(),randn(),randint(),random_integers()等random系函数的使用
6、矩阵常见运算
6.1 矩阵乘法
主要有两个函数,一个是dot,一个是matmul,都可以在官网找到资料。
numpy.dot
numpy.matmul
在一维和二维的时候dot比matmul应用场景更广,我把dot函数的部分介绍内容从官网摘抄过来
matmul不能对标量(单独的数)进行运算。
代码示例:
>>> np.dot(3,4)
12
>>> a
array([1, 2])
>>> np.dot(a,3)
array([3, 6])
>>> b
array([3, 4])
>>> np.dot(a,b)
11
>>> c
array([[1, 2],
[3, 4]])
>>> d=np.ones([2,2])
>>> d
array([[1., 1.],
[1., 1.]])
>>> np.dot(c,d)
array([[3., 3.],
[7., 7.]])
>>>
#np.matmul(a,3)会报同样的错
>>> np.matmul(3,4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: matmul: Input operand 0 does not have enough dimensions (has 0, gufunc core with signature (n?,k),(k,m?)->(n?,m?) requires 1)
>>> np.matmul(a,b)
11
>>> np.matmul(c,d)
array([[3., 3.],
[7., 7.]])
>>>
超过二维的运算如果有需要可以去官网。
6.2 矩阵除法
divide和/效果是一样的
numpy.divide(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj]) = <ufunc 'true_divide'>
代码示例:
>>> a=np.arange(1,5)
>>> a
array([1, 2, 3, 4])
>>> b=np.arange(2,6)
>>> b
array([2, 3, 4, 5])
>>> b/a
array([2. , 1.5 , 1.33333333, 1.25 ])
>>> a/4
array([0.25, 0.5 , 0.75, 1. ])
>>> np.divide(a,4)
array([0.25, 0.5 , 0.75, 1. ])
>>>
7、常用矩阵
7.1 全为0的矩阵
官网地址:https://numpy.org/doc/stable/reference/generated/numpy.zeros.html?highlight=zeros#numpy.zeros
>>> np.zeros((2,3),dtype=int)
array([[0, 0, 0],
[0, 0, 0]])
>>> np.zeros(4,dtype=int)
array([0, 0, 0, 0])
>>>
7.2 全为1的矩阵
>>> np.ones((2,3),dtype=int)
array([[1, 1, 1],
[1, 1, 1]])
>>> np.ones(4)
array([1., 1., 1., 1.])
>>>
8、获得元素下标
可以通过nonzero函数实现,比如想获得,label里面等于0的下标。
>>> import numpy as np
>>> rng=np.random.default_rng()
>>> a=rng.choice([0,1],size=40)
>>> a
array([1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1,
0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0])
>>> np.nonzero(a==1)
(array([ 0, 1, 2, 3, 5, 8, 9, 16, 17, 21, 24, 25, 26, 29, 31, 34, 38]),)
>>>