python - 这个在整数上运行的 numpy 算法偶尔会返回浮点数,为什么?
问题描述
这是我正在重写的六边形晶格上生成点同心环的算法的一部分。
我以为这都是整数数学,但我发现在某些情况下,数组会意外地创建为浮点数!
在下面的序列中p0
是一个float64
for n=1
but int64
for 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]))
返回int64
但np.hstack(([1, 0, -1], 0*[7]))
返回float64
,所以它是0*[n]
在操作的元组中出现np.hstack
触发向上转换到float64
.
更新 2:刚刚在 Code Review 中问到:有没有更好、更清洁或“不那么棘手”的方法来让这些六边形的点阵列以这种螺旋图案排列?
解决方案
触发整个数组被转换为的,是使用andnp.float64
时获得的空列表:n=0
(n-1)*[n]
(n-1)*[-n]
print((n-1)*[n])
# []
np.hstack
从要连接的每个输入数组构造一个数组。对于每个数组,都会调用np.atleast_1d
,默认情况下会将空数组转换为np.float64
dtype:
np.atleast_1d([])
# array([], dtype=float64)
推荐阅读
- android - 如何在android studio中实现半窗
- python - 连续追加到列表时的Python内存管理
- microsoft-teams - 无法在 Teams 中保存自定义应用程序的选项卡
- c++ - 如果整个应用程序都是虚拟映射的,为什么 new 会进行系统调用?
- git - 如何将分支中旧提交中文件中的更改部分还原到该分支的 HEAD?
- php - 当定义的产品是 WooCommerce 购物车时添加折扣
- node.js - 无法在 Windows10 中安装 NodeGui 和 React-NodeGUI
- microservices - 如何处理多仓库中的共享库版本碰撞?
- reactjs - 如何在 Next.js 中使用自定义主题配置 Ant Design 并支持 CSS 模块功能
- c++ - 无法推断模板参数(对于简单的类函数)