将字符串转换为numpy数组
Posted
技术标签:
【中文标题】将字符串转换为numpy数组【英文标题】:Convert string to numpy array 【发布时间】:2015-03-28 06:24:57 【问题描述】:输入:
mystr = "100110"
所需的输出 numpy 数组:
mynumpy == np.array([1, 0, 0, 1, 1, 0])
我试过了:
np.fromstring(mystr, dtype=int, sep='')
但问题是我无法将字符串拆分为每个数字,因此 numpy 将其视为一个数字。知道如何将我的字符串转换为 numpy 数组吗?
【问题讨论】:
【参考方案1】:除了上述答案之外,当您使用 fromstring
DeprecationWarning: The binary mode of fromstring is deprecated, as it behaves surprisingly on unicode inputs. Use frombuffer instead
时,numpy 现在会给出弃用警告。
更好的选择是使用fromiter
。它的执行速度是原来的两倍。这就是我在 jupyter notebook 中得到的 -
import numpy as np
mystr = "100110"
np.fromiter(mystr, dtype=int)
>> array([1, 0, 0, 1, 1, 0])
# Time comparison
%timeit np.array(list(mystr), dtype=int)
>> 3.5 µs ± 627 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.fromstring(mystr, np.int8) - 48
>> 3.52 µs ± 508 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.fromiter(mystr, dtype=int)
1.75 µs ± 133 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
【讨论】:
【参考方案2】:list
可以帮助您做到这一点。
import numpy as np
mystr = "100110"
print np.array(list(mystr))
# ['1' '0' '0' '1' '1' '0']
如果你想获取数字而不是字符串:
print np.array(list(mystr), dtype=int)
# [1 0 0 1 1 0]
【讨论】:
需要注意的是,对于较大的输入,grc 的第一个使用np.fromstring('...', np.int8)
的方法要快得多。从(大)字符串创建list
是不必要的。【参考方案3】:
您可以将它们读取为 ASCII 字符,然后减去 48(0
的 ASCII 值)。对于大字符串,这应该是最快的方法。
>>> np.fromstring("100110", np.int8) - 48
array([1, 0, 0, 1, 1, 0], dtype=int8)
或者,您可以先将字符串转换为整数列表:
>>> np.array(map(int, "100110"))
array([1, 0, 0, 1, 1, 0])
编辑:我做了一些快速的计时,第一种方法比先将其转换为列表快 100 倍以上。
【讨论】:
我强烈建议使用ord('0')
而不是48
。显式优于隐式。以上是关于将字符串转换为numpy数组的主要内容,如果未能解决你的问题,请参考以下文章
如何将numpy字符串数组转换为numpy数组,以使用MultiLabelBinarizer?
如何将包装为字符串的向量转换为熊猫数据框中的numpy数组?