求范式(np.linalg.norm)
1.ord: 范数类型
参数 | 说明 | 计算方法 |
默认 | 二范数 | ![]() |
ord=2 | 同上 | 同上 |
ord=1 | 一范数 | |
ord=np.inf | 无穷范数 |
2.axis:处理类型
axis=1表示按行向量处理,求多个行向量的范数
axis=0表示按列向量处理,求多个列向量的范数
axis=None表示矩阵范数。
3.keepdims:是否保持矩阵的二维特性
True表示保持矩阵的二维特性,False相反
import numpy as np
x = np.array([
[0, 3, 4],
[1, 6, 4]])
#默认参数ord=None,axis=None,keepdims=False
print "默认参数(矩阵2范数,不保留矩阵二维特性):",np.linalg.norm(x)
print "矩阵2范数,保留矩阵二维特性:",np.linalg.norm(x,keepdims=True)
print "矩阵每个行向量求向量的2范数:",np.linalg.norm(x,axis=1,keepdims=True)
print "矩阵每个列向量求向量的2范数:",np.linalg.norm(x,axis=0,keepdims=True)
print "矩阵1范数:",np.linalg.norm(x,ord=1,keepdims=True)
print "矩阵2范数:",np.linalg.norm(x,ord=2,keepdims=True)
print "矩阵∞范数:",np.linalg.norm(x,ord=np.inf,keepdims=True)
print "矩阵每个行向量求向量的1范数:",np.linalg.norm(x,ord=1,axis=1,keepdims=True)
reshape 参数-1的含义
Numpy 文档解释如下:
newshape : int or tuple of ints
The new shape should be compatible with the original shape. If an integer, then the result will be a 1-D array of that length. One shape dimension can be -1. In this case, **the value is inferred from the length of the array and remaining dimensions**.
大意是说,数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
z = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
z.shape
(4, 4)
代码段 小部件
也就是说,先前我们不知道z的shape属性是多少,但是想让z变成只有一列,行数不知道多少,通过`z.reshape(-1,1)`,Numpy自动计算出有16行,新的数组shape属性为(16, 1),与原来的(4, 4)配套。
squeeze()函数(删除数组中单维度的条目)
np.squeeze(a, axis=None)
1)a表示输入的数组;
2)axis用于指定需要删除的维度,但是指定的维度必须为单维度,否则将会报错;
3)axis的取值可为None 或 int 或 tuple of ints, 可选。若axis为空,则删除所有单维度的条目;
4)返回值:数组
5) 不会修改原数组;
作用:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
应用场景:在机器学习和深度学习中,通常算法的结果是可以表示向量的数组(即包含两对或以上的方括号形式[[]]),如果直接利用这个数组进行画图可能显示界面为空(见后面的示例)。我们可以利用squeeze()函数将表示向量的数组转换为秩为1的数组,这样利用matplotlib库函数画图时,就可以正常的显示结果了。
import numpy as np
a = np.arange(10).reshape(1,10)
a
array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
a.shape
(1, 10)
b = np.squeeze(a)
b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
b.shape
(10,)
copy()的用法
numpy
关于copy
有三种情况,完全不复制、视图(view
)或者叫浅复制(shadow copy
)和深复制(deep copy
)。
而 b = a[:]
这种形式就属于第二种,即视图,这本质上是一种切片操作(slicing
),所有的切片操作返回的都是视图。具体来说,b = a[:]
会创建一个新的对象 b
(所以 id(b)
和id(a)
返回的结果是不一样的),但是 b
的数据完全来自于a
,和 a
保持完全一致,换句话说,b
的数据完全由a
保管,他们两个的数据变化是一致的,可以看下面的示例:
import numpy as np
a = np.arange(4)
print(a)
b = a
c = a[:]
d = np.copy(a)
a[-1] = 10
print("b = " + str(b))
print("c = " + str(c))
print("d = " + str(d))
得到的结果如下所示:
[0 1 2 3]
b = [ 0 1 2 10]
c = [ 0 1 2 10]
d = [0 1 2 3]
b = a
和 b = a[:]
的差别就在于后者会创建新的对象,前者不会。两种方式都会导致 a
和 b
的数据相互影响。
要想不让 a
的改动影响到 b
,可以使用深复制:
d = np.copy(a)
//操作符作用
取整除 - 返回商的整数部分(向下取整) | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |