numpy中的“标量”是什么?

时间:2014-02-23 13:09:51

标签: python numpy scipy

The documentation说明了标量的目的,例如像float和integer这样的传统Python数字过于原始,因此需要更复杂的数据类型。

它还陈述了某些类型的标量(数据类型层次);以及标量的几个属性。
但它从未给出具体的定义,确切地说Python中的标量是什么。

我想谈谈这个问题的核心。所以我的问题是,用最简单的术语,向我解释一个pythonic标量是什么。

3 个答案:

答案 0 :(得分:39)

NumPy标量是np.generic的实例或其type位于np.ScalarType的任何对象:

In [12]: np.ScalarType
Out[13]: 
(int,
 float,
 complex,
 long,
 bool,
 str,
 unicode,
 buffer,
 numpy.int16,
 numpy.float16,
 numpy.int8,
 numpy.uint64,
 numpy.complex192,
 numpy.void,
 numpy.uint32,
 numpy.complex128,
 numpy.unicode_,
 numpy.uint32,
 numpy.complex64,
 numpy.string_,
 numpy.uint16,
 numpy.timedelta64,
 numpy.bool_,
 numpy.uint8,
 numpy.datetime64,
 numpy.object_,
 numpy.int64,
 numpy.float96,
 numpy.int32,
 numpy.float64,
 numpy.int32,
 numpy.float32)

此定义来自查看the source codenp.isscalar

def isscalar(num):
    if isinstance(num, generic):
        return True
    else:
        return type(num) in ScalarType

请注意,您可以使用np.isscalar

测试某些内容是否为标量
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True

我们如何知道我们所知道的? 我喜欢学习人们如何知道他们所知道的 - 而不仅仅是答案本身。因此,让我试着解释上述答案的来源。

拥有合适的工具可以帮助您自己找出这样的事情。

我使用IPython找到了这个。使用其TAB完成功能,键入

In [19]: import numpy as np
In [20]: np.[TAB]

导致IPython显示np模块命名空间中的所有变量。搜索字符串"scalar"会引导您np.ScalarTypenp.isscalar。打字

In [20]: np.isscalar?

(注意末尾的问号)提示IPython显示np.isscalar的定义位置:

File:       /data1/unutbu/.virtualenvs/dev/lib/python2.7/site-packages/numpy/core/numeric.py

这就是我对isscalar定义的看法。或者,numpy documentation for isscalar也有源代码的链接。

答案 1 :(得分:8)

在这种情况下,标量是你放入数组的东西之一。例如,一个64位浮点数或32位int,而不是它们的整个数组。

答案 2 :(得分:3)

只是非矢量。当作为参数传递时,numpy试图将它的向量解析为单个数字(即python标量),并且当向量的长度不是 1 时会失败:

In [44]: float(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-93d25633ffc4> in <module>()
----> 1 float(a)

TypeError: only length-1 arrays can be converted to Python scalars