栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Numpy中的0d数组不视为标量?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Numpy中的0d数组不视为标量?

人们不应该为之苦思。最终对个人的心理健康和长寿更好。

Numpy标量类型的奇怪情况是由于没有一种优雅而一致的方法将1x1矩阵降级为标量类型而产生的。即使从数学上讲它们是同一回事,但它们是由非常不同的代码处理的。

如果您一直在进行大量的科学编码,那么最终您希望

max(a)
可以在各种尺寸甚至标量的矩阵上工作。从数学上讲,这是一件非常明智的事情。但是,对于程序员而言,这意味着Numpy中出现标量的任何内容都应具有.shape和.ndim样式,因此至少ufunc不必对Numpy中21种可能的标量类型的输入进行显式类型检查。

另一方面,它们还应与 确实 对标量类型进行显式类型检查的现有Python库一起使用。这是一个难题,因为当将Numpy
ndarray简化为标量时,它们必须单独更改其类型,并且如果不对所有访问进行检查,就无法知道是否发生了这种情况。实际上,按照标量类型标准进行操作,可能会使工作变得有点荒谬。

Numpy开发人员的解决方案是从ndarray和Python标量继承其自身的标量类型,以便所有标量也具有.shape,.ndim,.T等。1x1矩阵仍将存在,但其使用将是如果您知道要处理标量,则不愿这样做。尽管从理论上讲这应该可以正常工作,但有时您仍然可以看到一些他们用油漆滚筒错过的地方,而丑陋的内部则暴露给所有人看:

>>> from numpy import *>>> a = array(1)>>> b = int_(1)>>> a.ndim0>>> b.ndim0>>> a[...]array(1)>>> a[()]1>>> b[...]array(1)>>> b[()]1

确实没有理由为什么

a[...]
a[()]
应该返回不同的东西,但是确实如此。有一些建议可以改变这一点,但是看起来他们忘了完成1x1阵列的工作。

一个潜在的更大且可能无法解决的问题是Numpy标量是不可变的。因此,在数学上将标量“喷洒”到ndarray(将数组折叠成标量的伴随操作)是要实现的PITA。您实际上不能增长一个Numpy标量,即使它

newaxis
神秘地起作用,也无法将其定义为ndarray

>>> b[0,1,2,3] = 1Traceback (most recent call last):  File "<stdin>", line 1, in <module>TypeError: 'numpy.int32' object does not support item assignment>>> b[newaxis]array([1])

在Matlab中,增大标量的大小是完全可以接受的,并且无需任何操作。在Numpy中,您必须在

a = array(a)
所有您 认为
有可能以标量开始并以数组结尾的地方保持震撼。我理解为什么Numpy必须采用这种方式才能与Python完美兼容,但这并不能改变许多新的切换器对此深感困惑的事实。有些人清楚地记忆着这种行为并最终坚持不懈,而另一些人则太遥远了,他们通常会留下一些深深的,无形的精神创伤,常常困扰着他们最纯真的梦想。这对所有人来说都是一个丑陋的局面。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648391.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号