MSe*_*ert 7 python arrays numpy division numpy-dtype
通常,dtype
当它等同于本机类型时,它是隐藏的:
>>> import numpy as np
>>> np.arange(5)
array([0, 1, 2, 3, 4])
>>> np.arange(5).dtype
dtype('int32')
>>> np.arange(5) + 3
array([3, 4, 5, 6, 7])
Run Code Online (Sandbox Code Playgroud)
但不知何故,这不适用于地板划分或模数:
>>> np.arange(5) // 3
array([0, 0, 0, 1, 1], dtype=int32)
>>> np.arange(5) % 3
array([0, 1, 2, 0, 1], dtype=int32)
Run Code Online (Sandbox Code Playgroud)
为什么会有区别?
Python 3.5.4,NumPy 1.13.1,Windows 64bit
您实际上在这里有多个不同的 32 位整数 dtype。这可能是一个错误。
NumPy 已经(意外地?)创建了多个不同的有符号 32 位整数类型,可能对应于 Cint
和long
. 它们都显示为numpy.int32
,但它们实际上是不同的对象。在 C 级别,我相信类型对象是PyIntArrType_Type
and PyLongArrType_Type
,在此处生成。
dtype 对象具有type
与该 dtype 的标量的类型对象相对应的属性。NumPy在决定是否在数组的 中打印信息时检查的正是这个type
属性:dtype
repr
_typelessdata = [int_, float_, complex_]
if issubclass(intc, int):
_typelessdata.append(intc)
if issubclass(longlong, int):
_typelessdata.append(longlong)
...
def array_repr(arr, max_line_width=None, precision=None, suppress_small=None):
...
skipdtype = (arr.dtype.type in _typelessdata) and arr.size > 0
if skipdtype:
return "%s(%s)" % (class_name, lst)
else:
...
return "%s(%s,%sdtype=%s)" % (class_name, lst, lf, typename)
Run Code Online (Sandbox Code Playgroud)
在numpy.arange(5)
和 上numpy.arange(5) + 3
,.dtype.type
是numpy.int_
; onnumpy.arange(5) // 3
或numpy.arange(5) % 3
,.dtype.type
是另一种 32 位有符号整数类型。
至于为什么+
和//
有不同的输出 dtypes,它们使用不同的类型解析例程。这是一个 for //
,这是一个 for +
。//
的类型解析寻找一个 ufunc 内部循环,该循环采用可以安全地将输入转换为+
的类型,而的类型解析将 NumPy 类型提升应用于参数并选择与结果类型匹配的循环。
归档时间: |
|
查看次数: |
238 次 |
最近记录: |