文章目录

  • ​​python numpy​​
  • ​​矩阵乘法​​
  • ​​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对矩阵求范数。

numpy基础_python

参考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)