The documentation说明了标量的目的,例如像float和integer这样的传统Python数字过于原始,因此需要更复杂的数据类型。
它还陈述了某些类型的标量(数据类型层次);以及标量的几个属性。
但它从未给出具体的定义,确切地说Python中的标量是什么。
我想谈谈这个问题的核心。所以我的问题是,用最简单的术语,向我解释一个pythonic标量是什么。
答案 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 code的np.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.ScalarType
和np.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