关于Numpy中transpose()和stack()函数的解析!(Numpy.transpose()和Numpy.stack())

最近在看斯坦福大学的cs231n机器学习课程,第一节的assignment1里的KNN线性分类器中用到了这两个函数,由于我是新手,就看不懂这两个函数坐了什么,其实结合那个例程,这个函数当时会觉得好像明白了它的意思,但是后来在CSDN上看了一个讲stack()函数的博客,彻底把我搞懵了,研究了一天,结果发现这两个函数(Numpy.transpose()和Numpy.stack())是有很强的相似性的。下面开始分析,因为本人也是研究生一枚,刚入机器学习不久,错误之处,还望大神不吝指正,邮箱评论均可(邮箱:568884899@qq.com)。

首先,网上关于Numpy.stack()的具体理解还是很少的,其中有一篇博主写的很详细,但是长篇大论都在讲自己怎么理解,我看了一半我真的不知道这个博客在讲什么,什么套箱子,什么的。好吧可能是我太菜了,也有很多说看懂的,能看懂的可以尝试去看一看。但是,我觉得这个函数的设计绝不是那样的,官方文档几句话就解释完了(虽然并没有理解),所以说它应该没有那么复杂。链接在这,可自行查看:https://blog.csdn.net/csdn15698845876/article/details/73380803

我为什么要把Numpy.stack()和Numpy.transpose()放在一起来讲呢,他们真的是有共同点的。我不想在这里做重复的事情,所以,有前辈贡献的,我直接甩链接,大家点进去看,有补充的我会在后面补充。

首先是Numpy.transpose()函数,

这个函数官方的文档在这:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.ndarray.transpose.html

好吧,为了照顾英文不好的,我再以我的方式解释一下,(我的英文也不好,有错误的地方,欢迎指正)

大致的意思就是,以x.transpose()方式引用,接收一个参数(*axes,函数对一维数组没有作用,函数通过参数axes来变换传入数组的形状(shape)

axes参数一共有三种传入方式

①:不传入,即默认

假如原数组的shape是(0,1,2,3,4,...,n-1),变换以后是(n-1,...2,1,0)

②:传入元组

传入的元组必须和当前元组的维度个数相同,也就是现在是n维的数组,那么axes参数也必须是n维,而且元组的数必须是0到n-1的每一个数字组成的,代表新的数组的维度

例如一个三维的数组,shape是(2,3,4),axes数组必须是0,1,2这三个数,你可以是(0,1,2),这个表示不变化,也可以是(1,0,2)这个变换后的shape是(3,2,4),也可以是(2,1,0),这个变换后的shape是(4,2,3),也可以是(2,0,1),这个变换后的shape是(4,3,2)。

应该看明白了吧,例子自己举吧,列个数组就明白了,就是指定维度变换方式,所以这个很好理解。

还有个帖子我觉得写得不错,很详细,我很懒,懒得画图解释了,你们可以看看这个:

https://blog.csdn.net/u012762410/article/details/78912667

关于这个函数,写得好的帖子应该很多,不满意我的解释或者我推荐的也不满意,可以自行查找。

那么可能有人要问,变换后数组的数是怎么排布的呢?先不着急,先看Numpy.stack()函数

Numpy.stack()函数,

这个函数,我真的没找到几个好的解释,官方文档算一个,在这:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.stack.html

还有就是上面提到的那个,说了很多云里雾里的:

https://blog.csdn.net/csdn15698845876/article/details/73380803

真正让我有启发的是这个:

https://my.oschina.net/amui/blog/1601432

具体变换过程其实是和transpose()很相似的,只是transpose()需要一个元组来设计变换后的shape,而stack()只要一个axis来指定变换后的shape,具体变换方法看上个连接就好。

那么,最令人费解的是什么,是变换后的数,这也是两个函数的共同点,这两个函数,对传入的数不管是列表也好,元组也好,都会先使用numpy.array()变换,变换后的数组会是作为一个原型,以后所有的Numpy.transpose()和Numpy.stack()的作用都是在这个原型的基础上旋转得来的,举例来说,当输入的原型是三维的,你可以想象成一个立方体,所有你做的变换最终得到的数组的数字排列,只是这个立方体从不同的角度看得到的多维数组,各个数字之间的相对位置是不变的。这个只能想,没法画。可以写代码验证。

#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
# @Time    : 2018/9/13 17:04
# @Author  : Allen
# @File    : test.py
# @Software: PyCharm


import numpy as np

a = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
b = [[21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35], [36, 37, 38, 39, 40]]
c = [[41, 42, 43, 44, 45], [46, 47, 48, 49, 50], [51, 52, 53, 54, 55], [56, 57, 58, 59, 60]]


x = np.array((a, b, c))
print(x)
print(x.shape)

y = np.stack(x)
print(y)
print(y.shape)

z = np.stack(x, axis=0)
print(z)
print(z.shape)

w = np.stack(x, axis=1)
print(w)
print(w.shape)

g = np.stack(x, axis=2)
print(g)
print(g.shape)

h = np.stack(x, axis=2)
print(h)
print(h.shape)

k = np.stack(x, axis=-1)
print(k)
print(k.shape)

x = np.array((a, b, c))
print(x)
print(x.shape)

p = x.transpose((0, 1, 2))
print(p)
print(p.shape)

q = x.transpose((1, 0, 2))
print(q)
print(q.shape)

i = x.transpose((1, 2, 0))
print(i)
print(i.shape)

i = x.transpose((2, 1, 0))
print(i)
print(i.shape)

结果太长就不粘贴了,可以自行运行。

写代码的时候发现在google其实是能找到stack的详解的,没那么少。而且好像讲述了立方体的意思,都写到这里了不能白写,既然写了,就放出来,希望可以帮到某些人。如果有错误的地方,欢迎指正(568884899@qq.com)。或者你看的一头雾水,那就选择其他途径吧!到此为止。欢迎阅读!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值