数组与标量的numpy类型转换

时间:2015-11-25 02:56:01

标签: python arrays numpy

我经常使用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的行为有何不同?也许更好的问题是:无论原因是否好,决定何时发生这种转换的规则是什么?它真的只是数组与标量行为吗?

1 个答案:

答案 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