我经常使用numpy,最近因数据类型之间的转换处理方式而措手不及。
假设我有一个无符号的8位整数(uint8),其值为252.让我们创建一个新的变量,将其递增10,并打印变量的值及其类型。我不清楚这里会发生什么,因为252 + 10> 255(uint8的最大值)。但是我们看到添加“正常”发生,结果为262.新变量是64位整数:
>>> import numpy as np
>>> a = np.uint8(252)
>>> b = a + 10
>>> print (b, type(b))
262 <class 'numpy.int64'>
好。让我们尝试一个稍微不同的实验。这次我将252放入一个数组,并执行相同的添加。我们在下面看到结果现在是6而不是262,这意味着加法已经“缠绕”为零。结果数组仍然是uint8类型。
>>> c = np.array([1,2,252], dtype='uint8')
>>> d = c + 10
>>> print (d[2], np.dtype(d[2]))
6 uint8
我的问题是:这些案件之间numpy的行为有何不同?也许更好的问题是:无论原因是否好,决定何时发生这种转换的规则是什么?它真的只是数组与标量行为吗?
答案 0 :(得分:0)
在
$http({
method: 'GET',
url: '/testName'
}).then(function successCallback(response) {
// this callback will be called asynchronously
// when the response is available
}, function errorCallback(response) {
// called asynchronously if an error occurs
// or server returns response with an error status.
});
b = a + 10
的类型为b
,它是Python int,相当于10
。即使结果在np.int32
:
np.uint8
换句话说,添加(或以其他方式组合)和In [151]: type(a-10)
Out[151]: numpy.int32
In [152]: np.promote_types(np.uint8,int)
Out[152]: dtype('int32')
与int
会产生uint8
。
int
产生运行时溢出警告(第1次),b = a + np.uint8(10)
为b
。
向数组添加10将返回相同dtype的另一个数组
uint8(6)
但请注意:
c + 10
有一堆In [127]: np.array(252,np.uint8)+10
Out[127]: 262 # like the scalar case
In [128]: np.array([1,252],np.uint8)+10
Out[128]: array([11, 6], dtype=uint8)
In [134]: np.array([252],np.uint8)+10
Out[134]: array([6], dtype=uint8)
投射规则。我没有太多关注它们,但是在numpy docs中可以找到一些搜索。
numpy
是另一种检查这些行为的方法。它的doc可能是组合数组和标量时会发生什么的描述。
np.result_type
http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.result_type.html#numpy.result_type