numpy数组铸造统治不'安全'

时间:2015-03-04 11:51:07

标签: python arrays numpy types casting

将一个numpy数组索引为另一个 - 两者都定义为dtype ='uint32'。使用numpy.take索引并获得不安全的转换错误。以前没见过这个。知道发生了什么事吗?

Python 2.7.8 |Anaconda 2.1.0 (32-bit)| (default, Jul  2 2014, 15:13:35) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.

>>> import numpy
>>> numpy.__version__
'1.9.0'

>>> a = numpy.array([9, 7, 5, 4, 3, 1], dtype=numpy.uint32)
>>> b = numpy.array([1, 3], dtype=numpy.uint32)
>>> c = a.take(b)

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    c = a.take(b)
TypeError: Cannot cast array data from dtype('uint32') to dtype('int32') according to the rule 'safe'

1 个答案:

答案 0 :(得分:9)

这在使用需要指定索引或长度的NumPy函数时非常常见(它不只是take,例如参见here)。

问题是,出于索引目的,NumPy希望将uint32数组视为int32数组(可能是&#34;指针&#34; 32上的整数类型)位系统,np.intp)并希望将其转换为该类型。

它无法安全地执行此操作 - 无符号数组中的某些整数可能无法表示为带符号的32位整数。您看到的错误反映了这一点。

这意味着,如果b具有dtype int64或浮点数dtype,则会收到相同的错误,但如果它是int32或更小的整数dtype则不会。< / p>

对于它的价值,对于索引符号a[b]来说,这不是一个直接的问题,它允许不安全的转换(但如果索引超出范围会引发错误)。试着举例a[2**31] - NumPy强制转换为int32,但然后抱怨索引-2147483648超出范围。