2015-05-20 43 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“'放在字符串的任何位置,它也会做同样的事情 –