2016-12-14 25 views
-4

我需要將範圍轉換爲連續的數字。範圍是整數,結果應該是相同的。這是我到目前爲止有:numpy append changes int float and added zeroer

進口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?

+0

「mydata」,「numbers_list」和「numbers」的數據類型是什麼? – Benjamin

+0

mydata:int64,數字:int64,numbers_list變爲float64 – SLglider

+0

注意:base_dir vs basedir。當我運行你的代碼時,輸​​出是正確的,範圍爲4.91E + 07。 – Benjamin

回答

1

一個學習的重要教訓是,你應該總是選擇最適合您的問題正確的數據結構。在大多數情況下,如果你想添加/連接,那麼是錯誤的選擇,除非你可以簡單地設置最終數組(最終形狀)並通過設置它的切片來改變它。

在這種情況下,顯而易見的選擇將是使用一個正常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數組等追加/連擊將總是導致float陣列。使用np.empty(0, int)如果你想要一個整數數組:

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

嗨,這真的很有幫助。您不僅提供瞭解決方案,而且還解釋了出了什麼問題。 我在第一篇文章中發現了另一個錯誤:mydata [[xxxxx]]實際上必須是mydata([xxx])。因爲我必須在Excel中轉​​髮結果,所以它有助於將替換部分更改爲替換(',','; \ n'),因此我已將它們很好地列出。 TX。很多爲您的解決方案。 – SLglider

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是一個浮點數組。考慮提供emptydtype

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') 

級聯這些2個陣列之後,結果具有numbers_list的D型。

因此改變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參數。默認是科學符號。

有了正確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 
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()解決。