为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕丝7291255 2019-12-26 09:25:53

当然,0d数组是标量的,但是Numpy似乎并不这么认为...我是否缺少某些内容?还是我只是误解了这个概念?


>>> foo = numpy.array(1.11111111111, numpy.float64)

>>> numpy.ndim(foo)

0

>>> numpy.isscalar(foo)

False

>>> foo.item()

1.11111111111


查看完整描述

3 回答

?
慕瓜9086354

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


使用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.ndim

0

>>> b.ndim

0

>>> a[...]

array(1)

>>> a[()]

1

>>> b[...]

array(1)

>>> b[()]

1

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


一个潜在的更大且可能无法解决的问题是Numpy标量是不可变的。因此,从数学上将标量“喷”到ndarray是将数组折叠成标量的伴随操作,是要实现的PITA。您实际上不能增长一个Numpy标量,即使它newaxis神秘地起作用,它也不能定义为ndarray :


>>> b[0,1,2,3] = 1

Traceback (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完美兼容,但这并不能改变许多新的切换器对此深感困惑的事实。有些人清楚地记忆着这种行为并最终坚持不懈,而另一些人则太遥远了,他们通常会留下一些深深的,无形的精神创伤,常常困扰着他们最纯真的梦想。这对所有人来说都是个丑陋的局面。


查看完整回答
反对 2019-12-26
?
眼眸繁星

您必须稍微不同地创建标量数组:


>>> x = numpy.float64(1.111)

>>> x

1.111

>>> numpy.isscalar(x)

True

>>> numpy.ndim(x)

0

从纯粹的数学观点来看,numpy中的标量看起来可能与您习惯的概念有所不同。我猜您在考虑标量矩阵?


查看完整回答
反对 2019-12-26
?
胡子哥哥

其中很多似乎是观察事物的matlab方式- “您实际上不能增长Numpy标量” -也不能增长np.array。明确说明大小会增加意外O(N ^ 2)行为的难度。“它不能定义为ndarray” -就是np.asarray(scalar)这样。“ 1x1矩阵...” -在这里将事物视为固有的2D或矩阵是无济于事的 

查看完整回答
反对 2019-12-26

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信