8

我有一个包含 1 列的熊猫数据框,其中包含一串位,例如。'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)
4

3 回答 3

17

对于 string 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。对于小字符串,它很接近,但考虑timeit90 个字符的字符串的结果(我刚刚使用s * 10):

fromstring: 49.283392424 s
map/array:   2.154540959 s

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

于 2015-03-17T05:34:39.337 回答
2

一种 pandas 方法是在 df 列上调用 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])
于 2015-03-17T09:18:39.150 回答
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 数据类型的位

于 2019-02-19T12:19:40.673 回答