我需要将范围转换为连续的数字。范围是int型的,结果应该是相同的。这是我目前所做的:
import numpy as np
mydata = np.array (
[49123400, 49123499],
[33554333, 33554337])
numbers_list = np.empty((0))
base_dir = "/foo.csv"
for x in mydata:
numbers = np.arange(x[0], x[1]+1)
numbers_list = np.append(numbers_list, numbers, axis=0)
np.savetxt(base_dir, numbers_list, delimiter=";")
我想看到的是这样一份清单:
49123400,
49123401,
49123402,...
49123499,
33554333,
33554334,...
33554399
但我得到的是:
4.912340000000000000e+11 and so on...
我哪里出错了?为什么在我做追加的时候,从int变成了float?
3条答案
按热度按时间cdmah0mi1#
需要学习的一个重要教训是,你应该总是为你的问题选择正确的数据结构,在大多数情况下,如果你想追加/连接,那么numpy是错误的选择,除非你可以简单地设置最终的数组(带有它的最终形状),并通过设置切片来改变它。
在这种情况下,显而易见的选择是使用常规的python
list
和range
:这可以简单地转换为
numpy.array
:或者直接写入文件而不需要考虑数组:
最后,请注意为什么要将整数转换为
floats
:np.empty
创建了一个浮点数组,因此append/concatenate将始终生成float
数组。如果需要整数数组,请使用np.empty(0, int)
:bqf10yzr2#
在这种情况下,在一个迭代会话中逐步执行并在每一步查看
shape
和dtype
会有所帮助。注意,
numbers_list
是一个浮点数组。考虑为empty
提供一个dtype
连接这两个数组后,结果的dtype为
numbers_list
。因此,更改
empty
数据类型应保留int
数据类型。我一直在努力反对
np.append
,这是另一个误用它的例子,它只是np.concatenate
的一种形式,通常是列表追加的一个糟糕的替代品我建议构建一个列表并使用一个连接
因为你使用
savetxt
来写数字,所以看看它的fmt
参数,默认值是科学符号。使用正确的
fmt
,您将得到整数:yhqotfr83#
我在numpy数组中追加列时遇到了同样的问题。我使用
np.arange()
函数创建了一个只有一列的示例数组,然后我向其追加列,但数据变得混乱,如您所见:即使确保了dtypes的相等,问题也没有得到解决,但最终通过使用
np.zeros()
而不是np.arange()
得到了解决。