numpy将int更改为float并添加零

时间:2016-12-14 15:54:24

标签: python numpy

我需要将范围转换为连续数字。范围是整数,结果应该相同。这就是我到目前为止所做的:

将numpy导入为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 个答案:

答案 0 :(得分:2)

要学习的一个重要教训是,您应该始终为您的问题选择正确的数据结构。在大多数情况下,如果你想追加/连接,那么是错误的选择,除了你可以轻松设置最终数组(及其最终形状)并通过设置切片来改变它。

在这种情况下,显而易见的选择是使用普通 listrange

mydata = [[49123400, 49123499],
          [33554333, 33554337]]

mynewdata = []
for sublist in mydata:
    mynewdata.extend(range(sublist[0], sublist[1]+1))

>>> mynewdata
  [49123400, 49123401, 49123402, 49123403, 49123404, 49123405,
   49123406, 49123407, 49123408, 49123409, 49123410, 49123411,
   49123412, 49123413, 49123414, 49123415, 49123416, 49123417,
   49123418, 49123419, 49123420, 49123421, 49123422, 49123423,
   49123424, 49123425, 49123426, 49123427, 49123428, 49123429,
   49123430, 49123431, 49123432, 49123433, 49123434, 49123435,
   49123436, 49123437, 49123438, 49123439, 49123440, 49123441,
   49123442, 49123443, 49123444, 49123445, 49123446, 49123447,
   49123448, 49123449, 49123450, 49123451, 49123452, 49123453,
   49123454, 49123455, 49123456, 49123457, 49123458, 49123459,
   49123460, 49123461, 49123462, 49123463, 49123464, 49123465,
   49123466, 49123467, 49123468, 49123469, 49123470, 49123471,
   49123472, 49123473, 49123474, 49123475, 49123476, 49123477,
   49123478, 49123479, 49123480, 49123481, 49123482, 49123483,
   49123484, 49123485, 49123486, 49123487, 49123488, 49123489,
   49123490, 49123491, 49123492, 49123493, 49123494, 49123495,
   49123496, 49123497, 49123498, 49123499, 33554333, 33554334,
   33554335, 33554336, 33554337]

这可以简单地转换为numpy.array

>>> np.array(mynewdata)
array([49123400, 49123401, 49123402, 49123403, 49123404, 49123405,
       49123406, 49123407, 49123408, 49123409, 49123410, 49123411,
       49123412, 49123413, 49123414, 49123415, 49123416, 49123417,
       49123418, 49123419, 49123420, 49123421, 49123422, 49123423,
       49123424, 49123425, 49123426, 49123427, 49123428, 49123429,
       49123430, 49123431, 49123432, 49123433, 49123434, 49123435,
       49123436, 49123437, 49123438, 49123439, 49123440, 49123441,
       49123442, 49123443, 49123444, 49123445, 49123446, 49123447,
       49123448, 49123449, 49123450, 49123451, 49123452, 49123453,
       49123454, 49123455, 49123456, 49123457, 49123458, 49123459,
       49123460, 49123461, 49123462, 49123463, 49123464, 49123465,
       49123466, 49123467, 49123468, 49123469, 49123470, 49123471,
       49123472, 49123473, 49123474, 49123475, 49123476, 49123477,
       49123478, 49123479, 49123480, 49123481, 49123482, 49123483,
       49123484, 49123485, 49123486, 49123487, 49123488, 49123489,
       49123490, 49123491, 49123492, 49123493, 49123494, 49123495,
       49123496, 49123497, 49123498, 49123499, 33554333, 33554334,
       33554335, 33554336, 33554337])

甚至只是简单地写入文件而不打扰数组:

with open('yourfile', 'w') as file:
    file.write(str(mynewdata).replace(',', ';'))

最后说明为什么要将整数转换为floats

>>> np.empty((0))
array([], dtype=float64)

np.empty创建一个float数组,因此append / concatenate将始终生成float数组。如果需要整数数组,请使用np.empty(0, int)

>>> np.empty(0, int)
array([], dtype=int64)

答案 1 :(得分:1)

在这样的情况下,它可以在迭代会话中逐步执行,并在每一步查看shapedtype

In [254]: mydata = np.array( [
     ...: [49123400, 49123499],
     ...: [33554333, 33554337]])
In [255]: mydata
Out[255]: 
array([[49123400, 49123499],
       [33554333, 33554337]])
In [256]: mydata.shape
Out[256]: (2, 2)
In [257]: mydata.dtype
Out[257]: dtype('int32')
In [258]: numbers_list = np.empty((0))
In [259]: numbers_list
Out[259]: array([], dtype=float64)

请注意numbers_list是一个float数组。请考虑向empty提供dtype

In [260]: x=mydata[0]
In [261]: numbers = np.arange(x[0],x[1]+1)
In [262]: numbers.dtype
Out[262]: dtype('int32')
In [263]: numbers.shape
Out[263]: (100,)
In [264]: numbers_list = np.append(numbers_list, numbers, axis=0)
In [265]: numbers_list.shape
Out[265]: (100,)
In [266]: numbers_list.dtype
Out[266]: dtype('float64')

连接这两个数组后,结果的格式为numbers_list

因此,更改empty dtype应保留int dtype。

我一直在讨论np.append。这是滥用的另一个例子。它只是np.concatenate的一种形式,通常不能替代列表附加

我建议建立一个列表并使用一个连接

In [267]: numbers_list = [np.arange(x[0],x[1]+1) for x in mydata]
In [268]: len(numbers_list)
Out[268]: 2
In [269]: np.concatenate(numbers_list)
Out[269]: 
array([49123400, 49123401, 49123402, 49123403, 49123404, 49123405,
       49123406, 49123407, 49123408, 49123409, 49123410, 49123411,
       49123412, 49123413, 49123414, 49123415, 49123416, 49123417,
       49123418, 49123419, 49123420, 49123421, 49123422, 49123423,
       49123424, 49123425, 49123426, 49123427, 49123428, 49123429,
  ...
       49123496, 49123497, 49123498, 49123499, 33554333, 33554334,
       33554335, 33554336, 33554337])
In [270]: _.shape
Out[270]: (105,)

由于您使用savetxt来编写数字,请查看它的fmt参数。默认是scienctific表示法。

使用正确的fmt,您将获得整数:

In [272]: arr=np.concatenate(numbers_list)
In [273]: np.savetxt('test.txt',arr,fmt='%d',delimiter=',')
In [274]: cat test.txt
49123400
49123401
49123402
49123403
49123404

答案 2 :(得分:0)

我在向numpy数组添加列时遇到了同样的问题。我正在使用np.arange()函数创建一个包含一列的示例数组,然后我将列附加到它,但数据变得混乱,如您所见:

[[  0.00000000e+00  -1.56000000e+00]
[  1.00000000e+00   2.43000000e+00]
[  2.00000000e+00  -9.40000000e-01]
..., 
[  4.99700000e+03  -1.99000000e+00]
[  4.99800000e+03   4.10000000e-01]
[  4.99900000e+03  -7.00000000e-02]]

即使通过确保dtypes的相等性,问题也没有发生,但最终通过使用np.zeros()而不是np.arange()来解决。