2015-05-20 22 views
7

Sto provando a utilizzare la funzione join su un array numpy composto da sole stringhe (che rappresentano i valori binari) per ottenere la stringa unita per utilizzare la funzione numpy.fromstring, ma lo join la funzione non sembra funzionare correttamente.join function di un array numpy composto da stringa

Qualche idea del perché? Quale funzione alternativa posso usare per farlo?

Ecco un esempio standalone per mostrare il mio problema:

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.] 

Come si può vedere, utilizzando la funzione di join nella lista (binary_list) funziona correttamente, ma sulla matrice NumPy equivalente (binary_split_array) doesn 't: possiamo vedere la stringa restituita è solo 72 caratteri invece di 80.

+0

Ho trovato un modo alternativo (dovrei sapere come usare la barra di ricerca ormai ...) per unirmi usando la funzione 'tostring()'. Ma qualsiasi idea sul perché "unisciti" non funziona? –

risposta

3

il primo elemento della vostra join_binary_split_array è una stringa vuota:

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

Il primo elemento nell'elenco è:

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

Una stringa vuota ha una lunghezza di 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] 

La lunghezza della str di byte 8:

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

Calling tobytes fornirà la stessa lunghezza di uscita dell'elenco:

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.] 

La matrice numpy null byte in modo diverso a python, null byte vengono troncati.

+0

che è divertente ... se si fa esattamente la stessa cosa ma con 'table' non contenente il valore' 0! Funziona! ciò significa che la funzione 'numpy.array()' tratta in modo diverso la stringa ''0.00'' e'' 1.00'' o non riesco a capire correttamente? –

+0

Sembra in questo modo 'binary = table.tostring() +" \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 "' mostra lo stesso comportamento. Puoi mettere 'x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00" 'ovunque nella stringa e farà lo stesso –