企业建设网站维护,如何建立网站详细流程,网页制作设计,百度新闻app参考文章 numpy学习 numpy中的浅复制和深复制的详细用法 numpy中的np.where torch.gather()
Numpy的核心数据结构#xff0c;就叫做array就是数组#xff0c;array对象可以是一维数组#xff0c;也可以是多维数组
array本身的属性
shape#xff1a;返回一个元组#xf…参考文章 numpy学习 numpy中的浅复制和深复制的详细用法 numpy中的np.where torch.gather()
Numpy的核心数据结构就叫做array就是数组array对象可以是一维数组也可以是多维数组
array本身的属性
shape返回一个元组表示array的维度x.shape ndim一个数字表示array的维度的数目 size一个数字表示array中所有数据元素的数目 dtypearray中元素的数据类型
创建array
1.从Python的列表List和嵌套列表创建array需要用到numpy的array方法 注意n维就有n个右中括号比如2维就是([[ anp.array([1,2])a
array([1, 2])bnp.array([[1,2],[2,3]])b
array([[1, 2],[2, 3]])2.使用预定函数arange、ones/ones_lik全为1e、zeros/zeros_like全为0、empty/empty_like全为空、full/full_like指定数值、eye单位矩阵等函数创建 3.生成随机数的np.random模块构建 anp.arange(2,10,2)a
array([2, 4, 6, 8])anp.random.randn(2,2,2)a
array([[[ 0.652504 , 1.16510023],[-0.75828046, 0.95137823]],[[ 0.39619081, 0.54900311],[ 0.94932242, -0.66919562]]])numpy拷贝 看这段的时候在想neighborIdx应该是不会改变的但是每次用pdb调试的时候这个矩阵都会改变 其实是因为切片其实是浅拷贝也就是视图。切片改变原数组也会改变 也就是b is a,a[:]都是浅拷贝对应的复制数组变原数组也变 深拷贝a.copy()两者互不影响
浅复制主要有两种方式简单的赋值或者使用视图(view) 简单的赋值其实就是制造了一个别名数组并没有被copy成新的一份当使用其中一个别名改变数组值的时候另一个别名对应的值一并改变。也就是b is a
a np.arange(12)
a
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
b a
b is a
True
b.shape 3,4
b
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
a
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])视图就是制造了一个原数组的在numpy中定义为view的东西新视图的base是原数组区别在于新视图可以和原数组有不同的shape但当视图的值改变原数组的值也会发生改变。需要注意的是数组的切片其实就是生成视图的过程。如c a[:]其实就是生成了和a形状相同的a的view(完全切片)。也就是切片c a[:]
a
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
c a.view
c is a
False
c.base is a
True
c.shape 12
c[0] 520
a
array([[520, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])深复制就是制作一份原数组的copy了。
d a.copy()
d[0][0] 1314
d
array([[1314, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
a
array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])array索引
简单索引-切片索引 行列用都逗号分隔表示从哪到n-1的位置步长 注意负数‘-’表示最后位置为负表示从最后开始算第一个步长为负表示从后面开始数 a[x:y:m,:] a
array([[-0.50549574, -0.68884199, -0.84651543, -1.31251463],[-0.24952212, -0.01200736, 0.31297518, 0.90562104],[-0.88056443, 0.71146101, 0.8669948 , 0.46530352],[ 0.8001467 , 0.14129991, 0.29295588, -1.31864503]])a[1:3:1,:]
array([[-0.24952212, -0.01200736, 0.31297518, 0.90562104],[-0.88056443, 0.71146101, 0.8669948 , 0.46530352]])a[-1:1:-1,:]
array([[ 0.8001467 , 0.14129991, 0.29295588, -1.31864503],[-0.88056443, 0.71146101, 0.8669948 , 0.46530352]])神奇索引用整数数组进行的索引叫神奇索引数组里面套数组 这个我也是看了源码才知道还有这种索引方式 一维数组 indexs np.array([[0, 2], [1, 3]]) 两行两列对应四个位置索引 也就是a的第0个第2个组成第1行第1个第3个组成第2个 indexs np.array([[0, 2], [1, 3]])anp.arange(2,20,2)a
array([ 2, 4, 6, 8, 10, 12, 14, 16, 18])a[indexs]
array([[2, 6],[4, 8]])可以用到.argsort()方法会返回从小到大排序后的索引index 这个方法也在论文源码中常常用到 # 随机生成1到100之间的10个数字arr np.random.randint(1,100,10)arr
array([56, 74, 87, 82, 26, 23, 15, 12, 84, 48])arr.argsort()
array([7, 6, 5, 4, 9, 0, 1, 3, 8, 2], dtypeint64)arr.argsort()[-3:]
array([3, 8, 2], dtypeint64)arr[arr.argsort()[-3:]]
array([82, 84, 87])二维数组 注意a[[0,2]]和a[0,2]不同 注意筛选多列时行不可省略 描述形式就是两个中括号一个表示行一个表示列 anp.arange(20).reshape(4,5)a
array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19]])a[[0,2]]
array([[ 0, 1, 2, 3, 4],[10, 11, 12, 13, 14]])a[0,2]
2a[:,[0,1,2]]
array([[ 0, 1, 2],[ 5, 6, 7],[10, 11, 12],[15, 16, 17]])a[[0, 2, 3], [1, 3, 4]]
array([ 1, 13, 19])布尔索引