numpy回顾

Numpy回顾

之前电脑重装了,写的Numpy全没了(/(ㄒoㄒ)/~~),重新整理附带回顾一哈,参考资料 Numpy中文网

安装和最基本使用

pip install numpy
import numpy as np
print(np.eye(4))

备注:在python console即ipython中使用%pylab即可方便的调用numpy和matplotlib

Numpy数组和Python Array之间的区别

  1. Numpy在创建数组时具有固定的大小,改变其大小将创建一个新数组并删除原来的数组
  2. Numpy中的数组都时相同的数据类型,因此占位内存相同
  3. Numpy底层使用C语言编写,在涉及到ndarry时,逐个元素的操作由预编译的C代码快速执行

Numpy基础知识

[[ 1., 0., 0.],
 [ 0., 1., 2.]]
# 此数组有两个轴,一轴长度为2,二轴长度为3
code description
ndarray.ndim 数组轴(维度)的个数
ndarray.shape 数组的维度 ->(n,m)
ndarray.size 数组元素的总数
ndarray.dtype 数组中元素类型的对象
ndarray.itemsize 数组中每个元素的字节大小

注意,调用np.array时必须使用列表类型作为参数

常用函数

  • 函数zeros创建一个由0组成的数组,参数为shape,ones创建一个由1组成的数组,参数同样为shape,默认情况下创建的dtype为float64
  • 函数arange类似于range,可设置步长为浮点数,同样为左闭右开
  • linspace,设置指定范围内的数字np.linspace(0,2,9)表示0~2内9个数组成的数组,双闭
  • 还有诸如sum,min,max.sqrt,exp,add之类的方法不一一介绍

数组输出(打印)

np.arrange(24).reshape(2,3,4)注意:reshape参数相乘必须等于数组size
若数组太大,Numpy会自动跳过数组的中心部分

使用np.set_printoptions(threshold=sys.maxsize)打印显示全数组

Numpy元素运算

乘积运算符* 在Numpy中按元素进行运算,若要计算矩阵乘积可以使用@运算符(python>=3.5)或dot函数执行

指定axis轴参数运算

使用轴运算时必须牢记之前所说的维度概念,0维(axis=0)表示最外层(即本数组),之后层层递进,而0维的运算就代表着下一维度块block之间的运算,最小维度为数字本身,即对于1维数组,axis=0的运算就是数字本身互相之间的运算(最小运算单位为数字),无axis=1

索引,切片和迭代

ndarray的索引与列表类似,均可以实现步进切片,a[::-1]倒置等操作

多维数组索引

多维数组索引时,仍然遵循维度递减概念和block概念

当索引少于维度(轴)的数量时,缺失的索引被认为是完整的切片

...表示完整索引元素的冒号,如下图所示,其中a[1,...]表示对于最外层+1层进行操作,即2block之间的操作,a[...,2]表示最后一层进行操作,即数字元素之间进行操作(block即为数字)

数组迭代时,默认为对于维度一(即最外层+1)进行迭代,可是使用多重迭代进行每个维度的显示,可以使用 ndarray.flat迭代来直接显示最小维度(数字本身)

数组维度变换

a.ravel() = a.reshape(a.size)将多维数组转为一维数组 ,不改变原数组

使用resize方法将改变数组本身,且传入参数为数组或元组

如果在reshape中将某一维度指定为-1,则会自动计算维度

堆叠

a = np.floor(10*np.random.random((2,2))) b=np.floor(10*np.random.random((2,2)))->np.vstack((a,b))/np.hstack((a,b))

注意:堆叠的两个矩阵必须具有相同的shape,且按照元组顺序堆叠

使用np.r_ 和 np.c_可以便捷的利用切片创建数组

column_stack按照列堆叠数组,略

l1 = [1,3,5,6]
l2 = [22,44,66,77]
np.r_[l1[:3],l2[-2:]]
Out[50]: array([ 1,  3,  5, 66, 77])

拆分

c
Out[63]: 
array([[  2.,   0.],
       [  2.,   1.],
       [266., 377.],
       [207., 313.]])
cc = np.vsplit(c,2)
cc
Out[65]: 
[array([[2., 0.],
        [2., 1.]]),
 array([[266., 377.],
        [207., 313.]])]
type(cc),type(cc[1])
Out[66]: (list, numpy.ndarray)
# 注意:拆分时直接传入对象和参数,但堆叠时需要以元组形式传入

视图和浅拷贝

浅拷贝

c1 = cc.view() #创建了c1为cc的浅拷贝(仍然为ndarray格式)
c1.shape = 2,4 
cc.shape() #c1的shape改变不影响cc
c1[1,1] = 999 
cc # -> c1通过索引改变数值,cc数值也改变,及数据共享但格式不共享

深拷贝

a = np.arange(int(1e8)) b=a[:100].copy() del a

如果改为b = a[:100] 即使del a ,a也会在内存中持久存在

介绍一个比较有用的条件过滤并执行相关操作的API -> like map(func,iterator)

a = np.arange(10) np.where(a<5, a, 10*a) 等价于所有大于等于5的数执行10*a

花式索引和索引技巧

a = np.arrange(12)**2
i = np.array([1,3,5,8])
a[i] # array as indices must be integer

技巧一

获取最大值,然后获取最大值的索引

import pandas as pd
df = pd.DataFrame(result)
max_val = df.max().max()
# 最大值的行,axis=0是对行操作,即为列的最大值,axis=1是对列操作,即为行的最大值
print(df[df.max(axis=1) == df.max().max()].index)
print(df[df.max(axis=0) == df.max().max()].index)
print(df.iloc[51, 1035])
# 或者直接使用opencv -> cv2.minMaxLoc
min_val, max_val, min_loc, max_loc = minMaxLoc(result)

其他内容后续用到了再补

posted @ 2020-12-08 09:11  WheelCode  阅读(88)  评论(0)    收藏  举报