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

Salim Fadhley:

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

>>> foo = numpy.array(1.11111111111, numpy.float64)
>>> numpy.ndim(foo)
0
>>> numpy.isscalar(foo)
False
>>> foo.item()
1.11111111111
蒂姆·林(Tim Lin):

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python / numpy ValueError:预期的1D或2D数组,取而代之的是0D数组

为什么单个Numpy数组元素不是Python标量?

什么是 Numpy 标量和数组标量

NumPy:数组和标量列表中的2D数组

是否有获取0D numpy子数组的规范方法?

Python,numpy;如何最好地处理可能的0D数组

有没有一种pythonic方式将标量和0d数组更改为1d数组?

fprintf在txt文件中写入0D 0D 0A而不是0D 0A

为什么将数组视为函数参数C ++中的指针?

numpy中的“标量”是什么?

Python Word Vect numpy 数组,在保存到 csv 时出现维度错误,预期为 1D 或 2D 数组,而是得到 0D 数组

为什么将对象视为数组?

为什么大括号中的标量不插入为initializer_list

为什么将带有数组的“ for(列表中的可变项)”视为JavaScript中的不良做法?

为什么numpy中float128的最大值以下的数字被视为inf?

在测试不包含0的数组中是否存在0时,为什么javascript的“ in”运算符返回true?

为什么 JQ 将数组视为 CSV 输出中的单个字段?

为什么在此Javascript代码中不会将“ 0”和“未定义”视为错误?

为什么numpy.vectorize()更改标量函数的除法输出?

为什么Matlab在评估数组时会错误地返回0,而在评估标量时会正确地返回NaN?

标量值的numpy数组的用例是什么?

为什么将numpy对象视为全局对象?

如何将numpy中的1D数组视为(1 x n)2D数组?

Python 中的循环不更新数组,为什么?

为什么不导入包来在java中声明数组

为什么Swift中的数组索引不返回可选值?

为什么函数在 Java 中不返回数组?

在R中,为什么不-1 + 1 = 0

为什么字节在Java中不采用0xff?