首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Bitstring (1和0的字符串)转换为numpy数组

将Bitstring (1和0的字符串)转换为numpy数组
EN

Stack Overflow用户
提问于 2015-03-17 05:25:44
回答 3查看 7.7K关注 0票数 8

我有一个熊猫数据,包含1列,其中包含一串比特,如。'100100101'。我想将这个字符串转换成一个numpy数组。

我怎么能这么做?

编辑:

使用

代码语言:javascript
复制
features = df.bit.apply(lambda x: np.array(list(map(int,list(x)))))
#...
model.fit(features, lables)

导致model.fit错误

代码语言:javascript
复制
ValueError: setting an array element with a sequence.

我想出的适用于我的情况的解决方案是标记的答案:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-17 05:34:39

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

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

代码语言:javascript
复制
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中。

代码语言:javascript
复制
import numpy as np

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

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

然后

代码语言:javascript
复制
# 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):

代码语言:javascript
复制
fromstring: 49.283392424 s
map/array:   2.154540959 s

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

票数 18
EN

Stack Overflow用户

发布于 2015-03-17 09:18:39

熊猫的一种方法是调用df列上的apply来执行转换:

代码语言:javascript
复制
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])
票数 2
EN

Stack Overflow用户

发布于 2019-02-19 12:19:40

检查unpackbits

代码语言:javascript
复制
>>> np.unpackbits(np.array([int('010101',2)], dtype=np.uint8))
array([0, 0, 0, 1, 0, 1, 0, 1], dtype=uint8)

更广泛地说:

代码语言:javascript
复制
>>> 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位,请查看How to extract the bits of larger numeric Numpy data types

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29091869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档