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()

下面这篇文章写的特别的详细:

np.max()、np.argmax()、np.maximum()、np.min()、np.argmin()、np.minimum()、np.sum()_dekiang-CSDN博客numpy专题——最值、求和最大值np.max()np.argmax()np.maximum()求和二级目录三级目录最大值np.max()参数解析np.max(array, axis=None, out=None, keepdims=False)一维ndarrayimport numpy as nparray1 = np.array([1, 3, 2, 8, 5])prin...https://blog.csdn.net/weixin_41560402/article/details/105277069

20、结构化数组的生成

使得其中xy坐标覆盖[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)

np.subtract.outer()_Gfqwy2021-CSDN博客_np.subtract.outer关于np.subtract.outer()的使用,以下做简单介绍import numpy as npa = np.array([5,6,7])b = np.array([9,12,10])np.subtract.outer(b,a)Out[11]: array([[4, 3, 2], [7, 6, 5], [5, 4, 3]])上述代码或许之前没接触...https://blog.csdn.net/weixin_43584807/article/details/103093386

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()函数

np.nditer()函数_流年里不舍的执着的博客-CSDN博客_nditer()函数在jupyter notebook 中同时输入多行from IPython.core.interactiveshell import InteractiveShellInteractiveShell.ast_node_interactivity = 'all'np.nditer(self, /, *args, **kwargs)有效的多维迭代器对象,可以遍历数组。参数:op : ...https://blog.csdn.net/weixin_43868107/article/details/102647760

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 100道练习题_一颗小甜心的博客-CSDN博客_numpy100题Numpy是Python做数据分析必须掌握的基础库之一,非常适合刚学习完Numpy基础的同学,完成以下习题可以帮助你更好的掌握这个基础库。Python版本:Python 3.6.2Numpy版本:Numpy 1.13.11. 导入numpy库并取别名为np (★☆☆)(提示: import … as …)import numpy as np2. 打印输出numpy的版...https://blog.csdn.net/qq_39362996/article/details/90204737

以上是关于numpy 学习中的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

Numpy学习

如何创建片段以重复变量编号中的代码行

Python库Numpy中的数据类型与OpenCV中数据类型的对应关系以及改写相关代码时需注意的地方

Numpy学习一:array数组对象

python numpy片段

乐哥学AI_Python:Numpy索引,切片,常用函数