【问题标题】:Convert a numpy array of strings to a numpy matrix将 numpy 字符串数组转换为 numpy 矩阵
【发布时间】:2019-11-24 00:04:48
【问题描述】:

所以我有一个 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 vecotrized 操作的操作,因为速度在这里很重要。在此示例中,行的长度为 2,但我需要一种具有任意行长度的通用方法。

谢谢!

【问题讨论】:

标签: python arrays string numpy character


【解决方案1】:

如果它不必那么快,你可以逐个元素地迭代它然后应用:

def seperate_sting(s):

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

    return output


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

【讨论】:

  • 感谢您的回答,但速度在这里很关键,我一直在寻找某种类型的矢量化操作。我会将信息添加到问题中。
  • 只有 int 值吗?他们是否被限制在 [0,9]?
  • 是的,它们是整数,但不限于[0,9]
【解决方案2】:

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

【讨论】:

  • np.matrix(';'.join(a)) 使用 ''1 2; 3 np.matrix 接受的 4" 语法。但这比列表理解要慢。np.matrix 仍然必须使用字符串操作来拆分行和数字,只是反转我们的连接。它不使用快速编译的代码来做那个。
【解决方案3】:

这是一种方法,假设非负整数成对出现,由一个空格隔开:

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

【讨论】:

  • 这似乎可行,但它假定每行的长度为 2,并且我对行更大的数组感兴趣,我会将信息添加到问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多