numpy 学习中的注意事项
Posted love the future
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy 学习中的注意事项相关的知识,希望对你有一定的参考价值。
1.python中的range()与numpy中的arange():都是生成一个数组
python 中的range():返回的是一个list,
函数说明: range(start, stop[, step]) -> range object,根据start与stop指定的范围以及step设定的步长,生成一个序列。
参数含义:start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
end:技术到end结束,但不包括end.例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
numpy中的arange():返回的是一个数据,array对象。
python中的range函数步长不可以是float,但是numpy中的arange步长可以是float。
arange()函数主要是为了生成数组,如果想生成多维,可以使用reshape进行转换。
>>> range(0,5) #生成一个range object,而不是[0,1,2,3,4]
range(0, 5)
>>> c = [i for i in range(0,5)] #从0 开始到4,不包括5,默认的间隔为1
>>> c
[0, 1, 2, 3, 4]
>>> c = [i for i in range(0,5,2)] #间隔设为2
>>> c
[0, 2, 4]
import numpy as np
>>> np.arange(3)
array([0, 1, 2])
>>> np.arange(3.0)
array([ 0., 1., 2.])
>>> np.arange(3,7)
array([3, 4, 5, 6])
>>> np.arange(3,7,2)
array([3, 5])
2.切片操作
a[i:j:s]
这里的s表示步进,缺省为1.(-1时即翻转读取)
所以a[i:j:1]相当于a[i:j]
a= np.array([1,2,3,4,5])
#表示的是不会唱为2,从索引为一的位置开始
a[1::2]=0
#[1, 0, 3, 0, 5]
a= np.array([1,2,3,4,5])
#步长为2,默认从索引为0的位置开始
a[::2]=0
#[0, 2, 0, 4, 0]
数组的逆置:[::-1]
a3=np.arange(10,20,3)
a3=a3[::-1]
a3
a3=[i for i in range(10)]
a3[::-1]
创建一个2维数组,该数组边界值为1,内部的值为0
a8=np.ones((10,10))
a8[1:-1,1:-1]=0
3.从数组中找到非0元素的索引值
np.nonzero(np.array([1,2,0,0,4,0]))
4.创建单位矩阵:
# a5=np.ones((3,3))
# a5 #这个代表的全一矩阵
a5=np.eye(3)
a5 #这个代表的是单位矩阵
5.随机矩阵的生成
np.array(arr):
参数是一个数组,相当于将当前数组复制一个新的
np.asarray(arr):
就是使用的之前的数组,也就是当arr改变的时候,用asarray生成的数组也会改变。
5.1 np.random.random((3,3,3))
生成(3,3,3)的数组,随机数是0-1之间的浮点数
5.2 np.random.rand:
通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1。
5.3 np.random.randint
numpy.random.randint(low, high=None, size=None, dtype='l')
函数的作用是,返回一个随机整型数,范围从低(包括)到高(不包括),即[low, high)。
如果没有写参数high的值,则返回[0,low)的值。
>>>np.random.randint(2, high=10, size=(2,3))
array([[6, 8, 7],
[2, 5, 2]])
5.4 np.random.randn:
过本函数可以返回一个或一组服从标准正态分布的随机样本值。标准正态分布是以0为均数、以1为标准差的正态分布,记为N(0,1)
6.数组的扩充pad
Z = np.ones((5,5))
#Z需要进行扩充的矩阵。pad_width需要扩充的行数,扩充为常数,值为0
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
print(Z)
7.关于nan
0 * np.nan #nan 0与一个不是数相乘还是为nan
np.nan == np.nan #False
np.inf > np.nan #False
np.nan - np.nan #nan
np.nan in set([np.nan]) #True
0.3 == 3 * 0.1 #False
8.设置对角线矩阵。
np.diag([1,2,3,4],1)
[1,2,3,4]需要进行放置在对角线上的数组,1表示的是向上偏移一个位置,就是对角线上面一个位置。
如果第二各参数是-1,表示的是向下进行偏移一个单位,表示在对角线下面的一个位置。
默认是0,表示的就是放在对角线上的元素。
9.unravel_index(indices, shape, order=‘C’)
函数的作用就是得到 indices 中每一项对应到形状为shape的数组中的坐标
order有两个取值:“C”,“F”。“C”表示的是以横坐标为基准;“F”表示的是以纵坐标为基准,默认是C
np.unravel_index(99,(6,7,8))
#获得6*7*8矩阵中的第99各元素的下标值
#(1, 5, 3)
10.numpy.tile(需要赋值的数组,行复制,列赋值),
Z = np.tile(np.array([[1, 0], [0, 1]]), (4, 4))
print (Z)
[[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]]
11 矩阵与矩阵相乘:np.dot|@
该相乘是满足左行乘右列的规则。
np.dot()
@
np.multiply()
b1=np.random.random((5,3))
b2=np.random.random((3,2))
np.dot(b1,b2)
b=b1@b2
b3=np.random.random((5,1))
np.multiply(b1,b3) #这个是表示b3分别与b1的每一列进行相乘。
#b1@b3 #会报错
# np.dot(b1,b3) #会报错
12 n np.copysign, np.ceil, np.abs
np.copysign():表示的是改变符号的函数
a=10
b=-2
np.copysign(a,b)#-10.0
#将第二个数的符号给了第一个数。
np.abs():取绝对值
np.ceil():往上取值。直接都将小数点网上进位。
np.floor():向下取整
np.trunc():直接取整数部分
13.np.intersect1d(Z1,Z2)返回两个数组中相同的元素值
14.日期函数
yesterday = np.datetime64('today') - np.timedelta64(1)
today = np.datetime64('today')
tomorrow = np.datetime64('today') + np.timedelta64(1)
np.arange('2016-07', '2016-08', dtype='datetime64[D]') #以天为单位
15.矩阵的运算
可以指定out输出矩阵的值。
A = np.ones((3,3))*1
print(A)
B = np.ones((3,3))*2
print(B)
np.add(A,B,out=B)
print("B:",B)
np.divide(A,2,out=A)
np.negative(A,out=A)
np.multiply(A,B,out=A)
16.np.sum和np.add.reduce,np.cumsum有什么区别
np.sum()对于小型的矩阵计算和的时候速度更快
在较大的矩阵,两者的区别并不是太大。
Z=np.random.random((3,3))
print(Z)
np.add.reduce(Z)#默认是按axis=0,就是按列进行相加
np.add.reduce(Z,1)#按行
np.sum(Z,0)#如果没有指定维度就是将矩阵中的数求和。
np.cumsum(Z)#不指定维度的话,就将该数组当成是一维数组
np.cumsum(Z,axis=0)#指定维度,就是逐行累加,第二行是一二行的和,第三行是前三行的和。
np.cumsum(Z,axis=1)#同上
17.判断两个矩阵是否相等,
==:直接用等号是会返回每一个对应元素比较之后的Boolean矩阵
allclose():直接返回两个矩阵是否相等。Ture/False
Z1=np.random.random((3,3))
Z2=np.random.random((3,3))
equal=np.allclose(Z1,Z2) #False
equal
Z1==Z2
#返回的是一个矩阵。
A = np.random.randint(0, 2, 5)
B = np.random.randint(0, 2, 5)
# 假设array的形状(shape)相同和一个误差容限(tolerance)
equal = np.allclose(A,B)
print(equal)
# 检查形状和元素值,没有误差容限(值必须完全相等)
equal = np.array_equal(A,B)
print(equal)
18.把数组数组只读 Z.flags.writeable
Z = np.zeros(5)
Z.flags.writeable = False
# Z[0] = 1 #报错
19.关于最值。
np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()
下面这篇文章写的特别的详细:
20、结构化数组的生成
使得其中x
和y
坐标覆盖[0, 1]x[1, 0]
区域,从(0,0)到(1,1)
也就是一块矩阵的位置。生成的是(x,y)点坐标的形式
Z = np.zeros((5, 5), [('x', float), ('y', float)])
Z['x'], Z['y'] = np.meshgrid(np.linspace(0, 1, 5), np.linspace(0, 1, 5))
print (Z)
[[(0. , 0. ) (0.25, 0. ) (0.5 , 0. ) (0.75, 0. ) (1. , 0. )]
[(0. , 0.25) (0.25, 0.25) (0.5 , 0.25) (0.75, 0.25) (1. , 0.25)]
[(0. , 0.5 ) (0.25, 0.5 ) (0.5 , 0.5 ) (0.75, 0.5 ) (1. , 0.5 )]
[(0. , 0.75) (0.25, 0.75) (0.5 , 0.75) (0.75, 0.75) (1. , 0.75)]
[(0. , 1. ) (0.25, 1. ) (0.5 , 1. ) (0.75, 1. ) (1. , 1. )]]
21.np.subtract.outer(X, Y)
X = np.arange(8)
print(X)
Y = X + 0.5
print(Y)
#np.subtract.outer(X, Y)相当于X[:None]-Y
#X[:None]就是一维数组,通过广播机制进行。
C = 1.0 / np.subtract.outer(X, Y)
print(C)
print(C.shape)#8*8
print(np.linalg.det)
22.np.set_printoptions-控制输出方式
np.set_printoptions(precision=4) #控制输出的小数点个数是4
np.array([1.123456789])
[ 1.1235]
np.set_printoptions(threshold=5) #控制输出的值的个数为6,其余以...代替
np.arange(10)
[0 1 2 ..., 7 8 9]
np.set_printoptions(threshold=float("inf")) #控制台输出所有的值,不需要省略号
np.arange(10)
[0 1 2 3 4 5 6 7 8 9]
eps = np.finfo(float).eps
x = np.arange(4.)
x**2 - (x + eps)**2
array([ -4.9304e-32, -4.4409e-16, 0.0000e+00, 0.0000e+00])
np.set_printoptions(suppress=True)
x**2 - (x + eps)**2
array([-0., -0., 0., 0.])
precision:控制输出的小数点个数,默认是8
threshold:控制输出的值的个数,其余以…代替;
当设置打印显示方式threshold=float("inf"),意思是输出数组的时候完全输出,不需要省略号将中间数据省略
suppress: 当suppress=True,表示小数不需要以科学计数法的形式输出
23.np.atleast_2d():将输入的数组看成至少有两维的数组
Z = np.random.random((10,2))
print(Z)
#就是将一个数组至少需要两维
print(Z[:,0].shape)#这样计算出来的只是一维数据,(10,)
X,Y = np.atleast_2d(Z[:,0], Z[:,1])
print(X) #(1*10)
print(X.shape)
24.astype()数据类型转换
Z = np.arange(10, dtype=np.int32)
print(Z) #int
Z = Z.astype(np.float32, copy=True)
print(Z) #float ,copy=Ture表示的就是返回一个新的数组,
25. np.ndenumerate, np.ndindex numpy中的两种枚举
Z = np.arange(9).reshape(3,3)
print(Z)
for index, value in np.ndenumerate(Z):
print(index, value)
print("------------------")
for index in np.ndindex(Z.shape):
print(index, Z[index])
26.np.put, np.random.choice在二维数组的随机位置放置p个元素
np.set_printoptions(threshold=float("inf"))
n = 10
p = 3
Z = np.zeros((n,n))
print(Z.shape)
np.put(Z, np.random.choice(range(n*n), p, replace=False),1)
#np.random.choice表示随机位置(10*10)中,p=3表示替换3个位置,用1进行替换
print(Z)
27.对数组的某一列进行排序:argsort
Z = np.random.randint(0,10,(3,3))
print(Z)
print(Z[ Z[:,1].argsort()])
[[2 6 4]
[2 8 9]
[0 2 9]]
[[0 2 9]
[2 6 4]
[2 8 9]]
28.如何判断一个给定的二维数组存在空列any
Z = np.random.randint(0,3,(3,10))
print(Z.any(axis=0)) #[ True True True True True True True True True True]
#表示每一列都有为空值的列
print(Z.any(axis=0).any())#True 表示有为空的值
29.从数组中找出与给定值最接近的值
Z = np.random.uniform(0,1,10)
print(Z)
z = 0.5
m = Z.flat[np.abs(Z - z).argmin()]
print(m)#找出在数组中与0.5最接近的数
30.np.nditer()函数
31.一个维度(5,5,3)的数组,如何将其与一个(5,5)的数组相乘
A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])
32.对一个数组中任意两行做交换
A = np.arange(25).reshape(5,5)
print(A)
print(A[[1,0]])#第一行和第0行交换
A[[0,1]] = A[[1,0]]
print(A)
更多复杂函数的应用可参考下面:
以上是关于numpy 学习中的注意事项的主要内容,如果未能解决你的问题,请参考以下文章