将比特串(由1和0组成的字符串)转换为numpy数组。

9

我有一个包含1列字符串位的pandas数据框,例如'100100101'。我想将此字符串转换为numpy数组。

我该如何做到这一点?

编辑:

使用

features = df.bit.apply(lambda x: np.array(list(map(int,list(x)))))
#...
model.fit(features, lables)

导致model.fit出现错误:
ValueError: setting an array element with a sequence.

针对我的情况,我得出的解决方案是基于已标记答案的:

for bitString in input_table['Bitstring'].values:
    bits = np.array(map(int, list(bitString)))
    featureList.append(bits)
features = np.array(featureList)
#....
model.fit(features, lables)
3个回答

19

对于字符串 s = "100100101",你可以至少使用两种不同的方法将其转换为numpy数组。

第一种方法是使用numpy的fromstring方法。 这有点笨拙,因为你必须指定数据类型并减去元素的“基值”。

import numpy as np

s = "100100101"
a = np.fromstring(s,'u1') - ord('0')

print a  # [1 0 0 1 0 0 1 0 1]

其中 'u1' 是数据类型,ord('0') 用于从每个元素中减去“基础”值。

第二种方法是将每个字符串元素转换为整数(因为字符串是可迭代的),然后将该列表传递到 np.array 中:

import numpy as np

s = "100100101"
b = np.array(map(int, s))

print b  # [1 0 0 1 0 0 1 0 1]

那么

# To see its a numpy array:
print type(a)  # <type 'numpy.ndarray'>
print a[0]     # 1
print a[1]     # 0
# ...

请注意,随着输入字符串s的长度增加,第二种方法的可扩展性显著下降。对于小字符串,它们之间的差距很小,但是考虑对90个字符的字符串进行timeit测试结果(我只是使用了s * 10):

fromstring: 49.283392424 s
map/array:   2.154540959 s

(这是使用默认的timeit.repeat参数,最少运行3次,每次运行计算运行1M字符串到数组转换所需的时间)


3
请注意,np.array(map(int, s)) 已足够 - 不必先构建一个 list ... 另外,虽然不是很直观,但 np.fromstring(s,'i1')-48 大约快50% ... - Jon Clements
@JonClements的表现在处理更长的列表时会变得更糟糕--感谢您的提醒! - jedwards
2
@JonClements 我认为在Python 3.x中这个说法已经不再适用了。现在map返回一个map对象(迭代器),你要么将其包装在list中,要么使用np.fromiter(map(int, s)) - Benjamin Doughty

2

在 pandas 中,一种方法是对数据框的列调用 apply 方法来执行转换:

In [84]:

df = pd.DataFrame({'bit':['100100101']})
t = df.bit.apply(lambda x: np.array(list(map(int,list(x)))))
t[0]
Out[84]:
array([1, 0, 0, 1, 0, 0, 1, 0, 1])

0

检查unpackbits

>>> np.unpackbits(np.array([int('010101',2)], dtype=np.uint8))
array([0, 0, 0, 1, 0, 1, 0, 1], dtype=uint8)

更一般地说:

>>> a = np.array([[2], [7], [23]], dtype=np.uint8)
>>> a
array([[ 2],
       [ 7],
       [23]], dtype=uint8)
>>> b = np.unpackbits(a, axis=1)
>>> b
array([[0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 1, 1, 1],
       [0, 0, 0, 1, 0, 1, 1, 1]], dtype=uint8)

如果您需要超过8位,请查看如何提取更大的Numpy数据类型的位


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