2015-05-20 44 views
7

我試圖在僅由字符串(表示二進制浮點數)組成的numpy數組上使用join函數來獲取連接字符串以便使用numpy.fromstring函數,但是使用join功能似乎不能正常工作。由字符串組成的numpy數組的連接函數

任何想法爲什麼?我可以使用哪種替代功能來做到這一點?

這裏是一個獨立的例子來說明我的問題:

import numpy as np 

nb_el = 10 

table = np.arange(nb_el, dtype='float64') 
print table 

binary = table.tostring() 

binary_list = map(''.join, zip(*[iter(binary)] * table.dtype.itemsize)) 
print 'len binary list :', len(binary_list) 
# len binary list : 10 

join_binary_list = ''.join(binary_list) 
print np.fromstring(join_binary_list, dtype='float64') 
# [ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] 

binary_split_array = np.array(binary_list) 
print 'nb el :', binary_split_array.shape 
# nb el : (10,) 
print 'nb_el * size :', binary_split_array.shape[0] * binary_split_array.dtype.itemsize 
# nb_el * size : 80 

join_binary_split_array = ''.join(binary_split_array) 
print 'len binary array :', len(join_binary_split_array) 
# len binary array : 72 

table_fromstring = np.fromstring(join_binary_split_array, dtype='float64') 
print table_fromstring 
# [ 1. 2. 3. 4. 5. 6. 7. 8. 9.] 

正如你所看到的,使用列表上的連接功能(binary_list)正常工作,但相當於numpy的陣列(binary_split_array)它不「T:我們可以看到返回的字符串是隻有72個字符,而不是80

+0

我發現了另一種方法(我應該知道如何使用搜索欄,現在......)使用'tostring()'函數進行連接。但任何想法爲什麼'加入'不起作用? –

回答

3

join_binary_split_array的第一個元素是一個空字符串:

print(repr(binary_split_array[0]))  
'' 

在列表中的第一個元素是:

'\x00\x00\x00\x00\x00\x00\x00\x00' 

空字符串的長度爲0:

print([len("".join(a)) for a in binary_split_array]) 
print([len("".join(a)) for a in binary_list]) 
[0, 8, 8, 8, 8, 8, 8, 8, 8, 8] 
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8] 

字節8的str的長度:

print(len('\x00\x00\x00\x00\x00\x00\x00\x00')) 
8 

呼叫tobytes將給出與列表相同的輸出長度:

print(len(binary_split_array.tobytes())) 
80 

table_fromstring = np.fromstring(binary_split_array.tobytes(), dtype='float64') 

print table_fromstring 
[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] 

numpy array handles空字節與python不同,空字節被截斷。

+0

這很有趣...如果你做同樣的事情,但'table'不包含值'0',它的工作原理!這意味着'numpy.array()'函數對字符串''0.00''和''1.00''的處理方式不同,還是我不能正確理解? –

+0

似乎這樣做'binary = table.tostring()+「\ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00」'表現出相同的行爲。你可以把'x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00「'放在字符串的任何位置,它也會做同樣的事情 –