Home > Software design >  Numpy function type casting automatically or not
Numpy function type casting automatically or not

Time:11-24

consider the following numpy code

foo = np.array([255, 255], dtype=np.uint8)
foo_sum = foo.sum()

foo_square_v1 = foo**2
foo_square_v2 = np.square(foo)
foo_square_v3 = np.pow(foo, 2)

foo_sum get correctly casted to uint64 and return 510 But all the 3 foo_square trigger no type casting and have an overflow (!!!), returning [1,1]

What's the rule of thumb to know whether I should do casting manually, or whether numpy do it automatically for me ?

My system: Python 3.x, X64 machine, Linux, numpy 1.20.3

CodePudding user response:

You seem to want NumPy to detect overflow and promote dtypes in response. NumPy will never do that. Most NumPy functionality will just use the same dtype as the input, or follow the default promotion rules when there are multiple dtypes.

numpy.sum is unusual, but even its dtype rules aren't what you want. Quoting the docs for numpy.sum (a is the input array):

The dtype of a is used by default unless a has an integer dtype of less precision than the default platform integer. In that case, if a is signed then the platform integer is used while if a is unsigned then an unsigned integer of the same precision as the platform integer is used.

The "default platform integer" here is C long (not C int). If C long is 32-bit (particularly on Windows) and you need a 64-bit output to avoid overflow, you'll still need to specify the dtype manually.

  • Related