首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将整数字符串列表转换为整数数组的最有效方法

将整数字符串列表转换为整数数组的最有效方法
EN

Stack Overflow用户
提问于 2019-05-17 00:08:23
回答 5查看 99关注 0票数 3

我有一个简单的问题-我需要将一个整数字符串转换为一个整数列表,并将其插入到一个numpy数组中。

我有可以工作的代码,但我对更有效的方法感兴趣。开始条件是我有一个整数字符串列表(第4行),目标是获得一个填充了这些整数的numpy数组。

下面是我使用的代码示例:

代码语言:javascript
复制
import numpy as np
print("Hello StackOverflow")

listOfStringOfINTs = ["123231231231231"]*5
print(listOfStringOfINTs)
numpyVectorOfInts = np.empty([len(listOfStringOfINTs),len(listOfStringOfINTs[0]) ], dtype='int')
for i, IntString in enumerate(listOfStringOfINTs):
    numpyVectorOfInts[i] = list(map(int, IntString))

print(numpyVectorOfInts)
EN

回答 5

Stack Overflow用户

发布于 2019-05-17 00:16:29

我不确定这在速度上是否更好,但它更简单:

代码语言:javascript
复制
In [68]: np.array([list(astr) for astr in listOfStringOfINTs],int)           
Out[68]: 
array([[1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1]])

list(astr)将字符串拆分为一个包含1个字符串的列表。带有int数据类型的np.array负责转换所有字符串。

或者,您可以将所有字符串连接到字符串中,生成列表,然后重塑数组:

代码语言:javascript
复制
np.array(list(''.join(listOfStringOfINTs)),int).reshape(5,-1)
票数 3
EN

Stack Overflow用户

发布于 2019-05-22 17:19:20

利用所有字符串都有相同字符数的事实,我们可以使用带有view的矢量化字符串-

代码语言:javascript
复制
def get_int_ar(a):
    return (np.array(a).view('u1')-48).reshape(len(a),-1)

示例运行-

代码语言:javascript
复制
In [143]: listOfStringOfINTs = ["123231231231231"]*5

In [144]: get_int_ar(listOfStringOfINTs)
Out[144]: 
array([[1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1]], dtype=uint8)
票数 2
EN

Stack Overflow用户

发布于 2019-05-17 00:34:42

为了好玩,这里有另一种方法:

代码语言:javascript
复制
>>> np.vstack(np.frombuffer(a,dtype=np.uint8)-48 for a in listOfStringOfINTs)
array([[1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1],
       [1, 2, 3, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1]], dtype=uint8)

此方法依赖于将ASCII字符作为无符号字符读取,然后依赖于数字1-9在ASCII表示中按顺序排列的事实。由于数字0表示为48,因此我们只需从所有值中减去48即可得到整数形式的值。

对于较小的字符串,它并不比@hpaulj的方法快,后者更具可读性:

代码语言:javascript
复制
In [1]: listOfStringOfINTs = ["123231231231231"]*10000

In [2]: %timeit np.vstack(np.frombuffer(a,dtype=np.uint8)-48 for a in listOfStringOfINTs)
10 loops, best of 3: 42.1 ms per loop

In [3]: %timeit np.array([list(astr) for astr in listOfStringOfINTs],int)
10 loops, best of 3: 36.3 ms per loop

但对于较大的字符串,它可以产生很大的不同:

代码语言:javascript
复制
In [4]: listOfStringOfINTs = ["123231231231231"*1000]*10000

In [5]: %timeit np.vstack(np.frombuffer(a,dtype=np.uint8)-48 for a in listOfStringOfINTs)
10 loops, best of 3: 115 ms per loop

In [6]: %timeit np.array([list(astr) for astr in listOfStringOfINTs],int)
1 loop, best of 3: 30.4 s per loop
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56172630

复制
相关文章

相似问题

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