所以我有一个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,但是我需要一种通用的方法,并具有任意的行长度。
谢谢!
答案 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()