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

2024-06-16 10:06:48 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我有一个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,但我需要一种具有任意行长度的通用方法。你知道吗

谢谢!你知道吗


Tags: 方法字符串numpy利用np矩阵数组array
3条回答

如果不需要那么快,您可以对其进行逐元素迭代,然后应用:

def seperate_sting(s):

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

    return output


seperate_sting('1 1')
>>> array([1, 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

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

相关问题 更多 >