首页 > 解决方案 > 这个在整数上运行的 numpy 算法偶尔会返回浮点数,为什么?

问题描述

这是我正在重写的六边形晶格上生成点同心环的算法的一部分。

我以为这都是整数数学,但我发现在某些情况下,数组会意外地创建为浮点数!

在下面的序列中p0是一个float64for n=1but int64for n>1,我根本无法弄清楚为什么会这样。

我正在运行 numpy 版本 1.17.3,在 MacOS 上安装 Python 3.7.3 的 Anaconda

import numpy as np
n_max = 3
for n in range(1, n_max+1):
    seq = np.arange(n, -n-1, -1, dtype=int)
    p0  = np.hstack((seq, (n-1)*[-n], seq[::-1], (n-1)*[n]))
    print('n: ', n)
    print('seq: ', seq)
    print('p0: ', p0.dtype, p0)
    print('')

返回

n:  1
seq:  [ 1  0 -1]
p0:  float64 [ 1.  0. -1. -1.  0.  1.]

n:  2
seq:  [ 2  1  0 -1 -2]
p0:  int64 [ 2  1  0 -1 -2 -2 -2 -1  0  1  2  2]

n:  3
seq:  [ 3  2  1  0 -1 -2 -3]
p0:  int64 [ 3  2  1  0 -1 -2 -3 -3 -3 -3 -2 -1  0  1  2  3  3  3]

这是预期的行为吗?

更新 1:好的np.hstack(([1, 0, -1], 1*[7]))返回int64np.hstack(([1, 0, -1], 0*[7]))返回float64,所以它是0*[n]在操作的元组中出现np.hstack触发向上转换到float64.

更新 2:刚刚在 Code Review 中问到:有没有更好、更清洁或“不那么棘手”的方法来让这些六边形的点阵列以这种螺旋图案排列?

标签: pythonpython-3.xnumpyfloating-pointinteger

解决方案


触发整个数组被转换为的,是使用andnp.float64时获得的空列表:n=0(n-1)*[n](n-1)*[-n]

print((n-1)*[n])
# []

np.hstack从要连接的每个输入数组构造一个数组。对于每个数组,都会调用np.atleast_1d,默认情况下会将空数组转换为np.float64dtype:

np.atleast_1d([])
# array([], dtype=float64)

推荐阅读