将字符串的一个numpy数组转换为一个numpy矩阵

时间:2019-07-15 09:45:54

标签: python arrays string numpy character

所以我有一个numpy的字符串数组,其中包含用空格分隔的数字值,例如:

np.array(['1 2', '3 4'])
array(['1 2', '3 4'], dtype='<U3')

,我想将其转换为数值矩阵,例如:

np.array([[1,2],[3,4]])
array([[1, 2],[3, 4]])

我正在寻找一种可以利用numpy电气化操作的操作,因为速度在这里很重要。在此示例中,行的长度为2,但是我需要一种通用的方法,并具有任意的行长度。

谢谢!

3 个答案:

答案 0 :(得分:1)

这里是一种假设非负整数成对的,两个整数成对,并用一个空格隔开的方法:

def to_num(x):                                          
    y = (x[:,None].view(np.int32)-48)*10**np.arange(x.itemsize//4-1,-1,-1)                    
    splt = y.argmin(1)                                                                        
    z = np.take_along_axis(y.cumsum(1),np.column_stack([splt-1,np.full(*y.shape-np.arange(2))]),1)
    z[:,1]+=10**(y.shape[1]-splt-1)*16-z[:,0]                                                    
    z[:,0]//=10**(y.shape[1]-splt)                                                               
    end = (y[:,::-1]>=0).argmax(1)
    z[:,1]+=np.concatenate([[0],48*np.cumsum(10**np.arange(end.max()))])[end]
    z[:,1]//=10**end
    return z

例如,在我的计算机上,10 ^ 6对大约需要3秒钟:

from timeit import timeit

x = np.random.randint(0,1000000,(1000000,2))
x = np.array([" ".join(map(str, y)) for y in x.tolist()])

(to_num(x) == [[int(z) for z in y.split()] for y in x.tolist()]).all()
# True
timeit(lambda:to_num(x), number=10)
# 2.9360161621589214

答案 1 :(得分:0)

如果不必那么快,则可以逐个元素地对其进行迭代,然后应用:

def seperate_sting(s):

    split_numbers = s.split(' ')
    output = np.asarray(split_numbers).astype(int)

    return output


seperate_sting('1 1')
>>> array([1, 1])

答案 2 :(得分:0)

首先,尝试用空格分割字符串,完成后检查函数numpy.asmatrix()