版权声明:本文为博主原创文章,未经博主允许不得转载。
在读图片时,会用到这么的一段代码:
image_vector_len = np.prod(image_size)#总元素大小,3*55*47
img = Image.open(path)
arr_img = np.asarray(img, dtype='float64')
arr_img = arr_img.transpose(2,0,1).reshape((image_vector_len, ))# 47行,55列,每个点有3个元素rgb。再把这些元素一字排开
transpose是什么意识呢? 看如下例子:
arr1 = array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
这是原来的矩阵。如果对其进行转置,执行arr2 = arr1.transpose((1,0,2))
得到:array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
过程是怎样的?
arr1.shape 应该是(2, 2, 4) 意为 2维,2*4矩阵
arr1.transpose(*args) 里面的参数,可以这么理解,他是调换arr1.shape的顺序,咱来给arr1.shape标一下角标哈,(2[0], 2[1], 4[2]) [ ] 里是shape的索引,对吧,
transpose((1, 0, 2)) 的意思是 按照这个顺序 重新设置shape 也就是 (2[1], 2[0], 4[2])
虽然看起来 变换前后的shape都是 2,2,4 , 但是问题来了,transpose是转置
shape按照(1,0,2)的顺序重新设置了, array里的所有元素 也要按照这个规则重新组成新矩阵
比如 8 在arr1中的索引是 (1, 0, 0) 那么按照刚才的变换规则,就是 (0, 1, 0) 看看跟你结果arr2的位置一样了吧,依此类推..
NumPy库的核心是矩阵及其运算。
使用array()函数可以将python的array_like数据转变成数组形式,使用matrix()函数转变成矩阵形式。
基于习惯,在实际使用中较常用array而少用matrix来表示矩阵。
然后即可使用相关的矩阵运算了
import numpy as np a = [[1,2,3],[4,5,5],[4,5,5]] len = a.shape[0] #多维数组的行数 print(a.dtype) #输出元素类型 #另外也还可以使用切片方式来处理数组
然后是涉及到的ufunc(universal function)运算,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。
1 >>> x = np.linspace(0, 2*np.pi, 10) 2 # 对数组x中的每个元素进行正弦计算,返回一个同样大小的新数组 3 >>> y = np.sin(x) 4 >>> y 5 array([ 0.00000000e+00, 6.42787610e-01, 9.84807753e-01, 6 8.66025404e-01, 3.42020143e-01, -3.42020143e-01, 7 -8.66025404e-01, -9.84807753e-01, -6.42787610e-01, 8 -2.44921271e-16])
有的通用运算函数有:
np.sin()
np.cos()
np.add(a,b)
a.sum(axis=0,1)#axis为0计算全部数据的和,为1则按行计算数据的和
等等其它矩阵可参与的数据计算。
a = array([[1,2,3],[2,3,4]])
array(list): 创建矩阵或高维向量,例如a = array([[0,1,2,3],[4,5,6,7]]),传入参数也可以是元组
shape: 表示向量大小的元组,例如a.shape结果为tuple,形如(2,3)
ndim: 表示矩阵或高维向量的维数,例如矩阵a的a.ndim为2
size: 表示向量总元素数
itemsize: 表示元素所占字节数
nbytes: 表示向量所占字节数
real: 所有元素的实部,返回的还是矩阵形式
imag: 所有元素的虚部,返回的还是矩阵形式
flat: 用一维数组表示矩阵或高维向量(常用于顺序遍历)
T: 表示矩阵的转置矩阵(也适用于高维向量),例如:a.T
zeros(shape): 创建全0矩阵或高维向量,例如a = zeros((2,3))
ones(shape):创建全1矩阵或高维向量,例如a = ones((2,3))
add(matrix):将矩阵对应元素相加,结果相当于直接用加号
dot(matrix)
矩阵乘法,注意必须满足“能乘”的要求
如果是*,则需注意:
1 aaa = array([[10,9,8],[7,6,5],[42,33,2]]) 2 a = aaa.min(0) #取每一列的最小值,返回的是一个数组 3 aaa*aaa#相当于aaa**2: 4 5 #[[ 100, 81, 64], 6 # [ 49, 36, 25], 7 # [1764, 1089, 4]] 8 9 aaa*a #aaa每行元素分别与a相乘,结果为 10 11 #[[ 70, 54, 16], 12 # [ 49, 36, 10], 13 # [294, 198, 4]] 14 15 a*aaa #结果与上相同 16 3*aaa #aaa中每个元素乘以3
reshape(shape)
得到改变形状的矩阵,例如a = array([[1,2,3],[4,5,6]]).reshape((3,2))的结果为[[1,2],[3,4],[5,6]]。注意矩阵的大小不能改变,即reshape的参数表示的矩阵元素数必须等于原矩阵的元素数。
transpose()
得到矩阵的转置矩阵,a.transpose()相当于a.T
swapaxes(d1,d2)
调换给定的两个维度
flatten()
返回对应一维向量,例如:
1 aaa = array([[10,9,8],[7,6,5],[42,33,2]]) 2 aaa.flatten() 3 #返回值为: 4 array([10, 9, 8, 7, 6, 5, 42, 33, 2])
tolist()
得到矩阵对象转化为list的结果
1 aa = aaa.tolist() 2 aa返回为list型(每一行又是一个子list): 3 [[10, 9, 8], [7, 6, 5], [42, 33, 2]] 4 aa[0] 5 #返回为: 6 [10, 9, 8]
min(axis)
得到所有元素中的最小值。当给定axis值(min(0)或min(axis=0))时,在该坐标上求最小值(得到数组)
例如:
1 aaa = array([[10,9,8],[7,6,5],[42,33,2]]) 2 aaa.min() 3 返回为:aaa矩阵中所有元素的最小值 4 结果为:2 5 aaa.min(0) 6 返回为:aaa矩阵中所有列中元素的最小值 7 结果为:array([7, 6, 2]) 8 aaa.min(1) 9 返回为:aaa矩阵中所有行中元素的最小值 10 结果为:array([8, 5, 2])
max(axis)
得到所有元素中的最小值。缺省参数axis作用和min()相同
sum()
得到数组元素之和,得到的是一个数字。
也可以aaa.sum(axis),分别求每一行或者是每一列的元素之和
cumsum()
得到累计和,即依次加一个元素求和的一维数组。
例如:
1 aaa.cumsum() 2 结果为:array([ 10, 19, 27, 34, 40, 45, 87, 120, 122])
prod()
得到数组所有元素之积,是个数字。也可以aaa.sum(axis),分别求每一行或者是每一列的元素之积
cumprod()
得到累计积,例子形式与上面cumsum()相同,这两个函数也都可以分坐标累计加和累计乘。
mean()
得到元素的平均数
all()
如果所有元素为真,返回真;否则返回假
any()
如果所有元素只要有一个真,返回真;否则返回假。
特征值
linalg.eigvals()
返回A的特征值
linalg.eig(A)
返回A的特征值和特征向量,例如(eval, evec) = linalg.eig(A),其中eval的对角元为A的各个特征值,evec对应各列是相应特征向量。
1 >>> a = array([[-1,1,0], 2 [-4,3,0], 3 [ 1,0,2]]) 4 >>> eval, evec = linalg.eig(a) 5 >>> eval 6 array([ 2., 1., 1.]) 7 >>> evec 8 array([[ 0. , 0.40824829, 0.40824829], 9 [ 0. , 0.81649658, 0.81649658], 10 [ 1. , -0.40824829, -0.40824829]])
即特征向量为λ1=2的(0,0,1)和λ2=λ3=1的(0.4,0.8,-0.4)