一个由字符串组成的numpy数组的join函数

7

我正在尝试在仅由字符串(表示二进制浮点数)组成的numpy数组上使用join函数来获取连接后的字符串,以便使用numpy.fromstring函数,但是join函数似乎无法正常工作。

有任何想法吗?我可以使用哪个替代函数来完成这个任务?

以下是一个独立的示例,展示了我的问题:

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)上使用join函数正常工作,但在相应的numpy数组(binary_split_array)上不起作用:我们可以看到返回的字符串只有72个字符而不是80个。

我找到了一种替代方法(我应该知道如何使用搜索栏了……)使用tostring()函数进行连接。但是你有任何关于为什么join不起作用的想法吗? - Thomas Leonard
1个回答

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:

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数组handles在处理空字节时与Python不同,空字节会被截断。


这很有趣...如果你用table而不是包含值0.,它就能正常工作!这意味着numpy.array()函数对字符串'0.00''1.00'的处理方式不同,或者我理解有误? - Thomas Leonard
似乎这样做 binary = table.tostring() + "\x00\x00\x00\x00\x00\x00\x00\x00" 会表现出相同的行为。您可以在字符串中的任何位置放置 x00\x00\x00\x00\x00\x00\x00\x00,它都会执行相同的操作。 - Padraic Cunningham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接