这是我正在重新编写的一种算法的一部分,用于在六边形点阵上生成同心圆。
我原本认为这里全部都是整数计算,但我发现在某些情况下数组意外地被创建为浮点数!
在下面的序列中,p0
在 n=1
时是 float64
类型,在 n>1
时是 int64
类型,我无法弄清楚为什么会出现这种情况。
我在 MacOS 上运行 numpy 版本 1.17.3,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]))
返回int64
,但np.hstack(([1, 0, -1], 0*[7]))
返回float64
,所以在元组中出现的0*[n]
触发了np.hstack
向上转换为float64
。
更新2: 刚刚在代码审查中询问:是否有更好、更清洁或“不那么棘手”的方法来排列这些螺旋图案中的六边形点阵?