文章目录
- 矩阵乘法
- linalg
- 数组深复制与浅复制
- np.random.seed()
- shuffle与permutation的区别
- np.pad
- np.linalg.norm--求范数
- np.expand_dims
- np.tile
- argsort
- diagonal()
- np.nonzero()
- np.var和np.mean
- np.cov(m,y,rowvar=True,bias=False,ddof,frequency weights,analytic weights)
- logical_and
- numpy 索引和切片
- np.nan
- np.arange
- np.argmax
python numpy
矩阵乘法
注意:两个(1,3)或(3,1)的矩阵不能直接使用np.dot(),可以使用np.dot()有两种情况,一种是都是一维数组,另外一种是满足矩阵相乘的运算,因为他们不是一维数(3,),所以不能运算.
#使用1
a = np.array([1,2,3])
np.dot(a,a)# 14
#使用二
b = a.reshape(1,3)
c = a.reshape(3,1)
np.dot(b,c)
#Out[11]: array([[14]])
对于上述求得的可以通过np.squeeze()可以将二维数组转化为一维数组
d = np.squeeze(np.dot(b,c)) #array(14)
而对于刚才的两个(1,3)的数组,我们如果想求他们对应元素相乘的和,可以先使用np.squeeze()压缩为一维数组再使用np.dot
b = np.squeeze(b)# array([1, 2, 3])
np.dot(b,b) # 14
或者直接使用np.multiply()使他们元素相乘(也可以使用*),再求和。
b = a.reshape(1,3)
c = np.multiply(b,b) #array([[1, 4, 9]])
linalg
计算行列式 np.linalg.det()
计算数组的逆 np.linalg.inv()
数组深复制与浅复制
- 注意:在对数组进行复制时,很容易出现深复制和浅复制的问题。
下述代码使用的就是浅复制。如果不想改动互相影响,可以使用深复制a.copy()
或者视图,视图是指使用切片如b=a[:]
,视图会新创建一个对象b。
a = np.array([1,2,3,4,5,6])
b = a
b[1] = a[1]+5
print(b)
print(a)
c = a
print(c)
c[1] = a[1]+10
print(c)
#output
[1 7 3 4 5 6]
[1 7 3 4 5 6]
[1 7 3 4 5 6]
[ 1 17 3 4 5 6]
使用深复制:
a = np.array([1,2,3,4,5,6])
b = np.copy(a)
b[1] = a[1]+5
print(b)
print(a)
c = a
print(c)
c[1] = a[1]+10
print(c)
output:
[1 7 3 4 5 6]
[1 2 3 4 5 6]
[1 2 3 4 5 6]
[ 1 12 3 4 5 6]
参考【Python】numpy 中的 copy 问题详解
np.random.seed()
- 利用随机数种子,每次生成的随机数相同。
- np.random.seed(Argument),采用相同的随机数的参数生成的随机数是相同的。
i = 0
np.random.seed(0)
while(i<2):
print(np.random.randn(1, 5))
i += 1
i = 0
np.random.seed(1)
while(i<2):
print(np.random.randn(1, 5))
i += 1
i = 0
np.random.seed(0)
while(i<2):
print(np.random.randn(1, 5))
i += 1
output:
[[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
[[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
[[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763]]
[[-2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]]
[[1.76405235 0.40015721 0.97873798 2.2408932 1.86755799]]
[[-0.97727788 0.95008842 -0.15135721 -0.10321885 0.4105985 ]]
shuffle与permutation的区别
np.random.permutation与np.random.shuffle都是对数组重新洗牌,区别在于shuffle在原来的数组进行操作(原地洗牌),而permutation并不改变原来的数组,返回一个新的打乱顺序的数组。同时可以直接对permutation输入一个数字生成一个range元素的数组。
a = np.random.permutation(12)
Out[21]: array([ 2, 6, 4, 8, 0, 10, 5, 7, 11, 9, 3, 1])
np.random.shuffle(a)
Out[23]: array([ 1, 2, 8, 6, 10, 0, 5, 11, 3, 4, 7, 9])
参考Numpy.random中shuffle与permutation的区别
np.pad
假设x为四维矩阵,可以填充’constant’/‘edge’/‘maximum’/'mean’等,用例:
x = np.zeros((1,2,3))
y = np.pad(x,((0,0),(1,1),(0,1)),'constant',constant_values=((1,1),(0,0),(2,2)))# 前加-后加
#output
array([[[0., 0., 0., 2.],
[0., 0., 0., 2.],
[0., 0., 0., 2.],
[0., 0., 0., 2.]]])
np.linalg.norm–求范数
linalg = linear + algebra.norm
x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False)
x为矩阵,ord求得范数类型,axis计算范数的维度,axis=None对矩阵求范数。
参考np.linalg.norm(求范数)
np.expand_dims
此函数用于扩展数组,可以看出可以增加维度的位置为原有维度+1,增加维度没有改变原有的数据内容,但是增加了一个维度。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
a.shape
Out[4]: (2, 3)
b = np.expand_dims(a,axis=0)
b.shape
Out[6]: (1, 2, 3)
c = np.expand_dims(a,axis=1)
c.shape
Out[8]: (2, 1, 3)
d = np.expand_dims(a,axis=2)
d.shape
Out[10]: (2, 3, 1)
b
Out[11]:
array([[[1, 2, 3],
[4, 5, 6]]])
c
Out[12]:
array([[[1, 2, 3]],
[[4, 5, 6]]])
d
Out[13]:
array([[[1],
[2],
[3]],
[[4],
[5],
[6]]])
np.tile
表示对数组按行或者按列重复次数。
tile([1,2],(2,1))# 对数组按行重复2次,按列重复1次
tile([1,2],(1,3))# 对数组按行重复1次,按列重复3次
output:
array([[1, 2],[1, 2]])
array([[1, 2, 1, 2, 1, 2]])
argsort
输出数组排序的idx从小到大,如1是最小的一个数,则会第一输出1的索引2.
np.array([4,5,1,2,6]).argsort()
output: array([2, 3, 0, 1, 4])
diagonal()
获取数组的对角线元素组成一个数组
import numpy as np
a = np.random.rand(3,3)
a.diagonal()
output:
array([0.99319067, 0.1244976 , 0.30771479])
np.nonzero()
输出非零元素的索引数组的tuple,例如,一个二维数组nonzero输出一个包含两个array的tuple.
a = np.array([[1,0,2],[3,5,0]])
np.nonzero(a)
output:
(array([0, 0, 1, 1]), array([0, 2, 0, 1]))
np.var和np.mean
求均值和方差操作类似,通过axis指定操作的轴。
a = np.array([[1,2,3],[1,5,6]])
np.var(a,axis=0)按行计算方差
output:
array([0. , 2.25, 2.25])
np.var(a,axis=1)
output:
array([0. , 4.66666667])
np.cov(m,y,rowvar=True,bias=False,ddof,frequency weights,analytic weights)
m:一维或二维数组,默认每一行代表一个特征,每一列代表一个观测
y:与m相同的一组数据
rowvar:默认为True,每一行代表一个特征,每一列代表一个观测,当为False,相反。
bias:默认为False,标准化除以n-1,反之除以n
ddof:当其值非None时,bias参数作用将失效,当ddof为1时,将返回无偏估计(n-1),即使指定了fweights和aweights;当ddof为0时,则返回简单平均值。
frequency weights:一维数组,代表每个观测要重复的次数,相当于赋权重
analytic weights:一维数组,代表观测矢量权重。如果ddof=0,则可以使用权重数组将概率分配给观测向量。
#计算协方差的时候,一行代表一个特征
#下面计算cov(T, S, M)
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
X = np.vstack((T, S, M))#打包成一个数组
#X每行代表一个属性
#每列代表一个示例,或者说观测
print(np.cov(X))
#[[ 47.71969697 122.9469697 129.59090909]
#[122.9469697 370.08333333 374.59090909]
#[129.59090909 374.59090909 399. ]]
【Numpy学习记录】np.cov详解
logical_and
a = np.logical_and(True,False)
b = np.logical_and([1,2],[0,1])
c = np.arange(5)
d = np.logical_and(c>1,c<4)
print(a,b,d)
output:
False [False True] [False False True True False]
numpy 索引和切片
当我们想要获取正向的前三个和负向的前三个元素时,代码如下。可以看到,当反向切片时,想要获取固定个数元素需要负数索引
a = np.array([3,4,2,1,4,6,2,9])
b = np.argsort(a)
print(b)
c = b[:3]
d = b[:-(3+1):-1]
e = b[:3:-1]
print(c,'\n',d,'\n',e)
output:
[3 2 6 0 1 4 5 7]
[3 2 6]
[7 5 4]
[7 5 4 1]
np.nan
关于np.nan有以下几点:
1.np.nan不是一个None对象。
2.判断某个值是否是nan对象需要用np.nan(i)
,不可以使用i==np.nan
,会出现False
3.np.nan非空对象,其基本数据类型为float
4.判断是否为nan通过np.isnan(i)
,判断全体是否都是nan np.isnan(i).all()
。
5.pd.isnull(i)
对一个DataFrame或Series做空值检测.
np.arange
np.arange
与range
两者
- 均用于均分空间
- 均可用于迭代
- 均接受三个参数,生成区间均为左闭右开的区间
不同之处在于
-
np.arange
生成的是一个array
,range
生成的是range object
-
np.arange
可用于float
的步长,而range
不支持步长为小数
>>>range(1,5)
range(1,5)
>>>np.arange(1,5)
array([1, 2, 3, 4])
>>>np.arange(1,5,0.5)
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5])
>>>range(1,5,.5)
TypeError Traceback (most recent call last)
<ipython-input-22-963f42b8af5a> in <module>()
----> 1 range(1,5,.5)
TypeError: 'float' object cannot be interpreted as an integer
参考Python 基础——range() 与 np.arange()
np.argmax
Returns the indices of the maximum values along an axis.
返回numpy数组最大值的索引
np.argmax(a, axis=None, out=None)
- a : array_like
- axis : 比较最大值的维度,0表示按所有行的最大值索引,1表示所有列的最大值索引
- out : array
示例
b = np.array([[1,2,3],[1,2,3],[1,2,3]])
np.argmax(b,axis=1)
>>>array([2, 2, 2], dtype=int64)