Numpy reduce with char操作

cygmwpex  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(101)

我想要一个矢量化的方式来做:
第一个月
例如,我可能想将[0.1, 0.2, 0.3]发送到["string_0.1_string", "string_0.2_string", "string_0.3_string"],但是values的形状是任意的,而且可能很大。
然而,numpy.char.add似乎不是一个ufunc,而且不能只做numpy.char.add.reduce
是否有一个文档化的解决方案,或者我需要做一些聪明的事情?

0dxa2lsx

0dxa2lsx1#

您的样品列表/阵列:

In [71]: x=[0.1, 0.2, 0.3]; xx = np.array(x,'U5');xx
Out[71]: array(['0.1', '0.2', '0.3'], dtype='<U5')

字符串
从文档中可以清楚地看到,char.add不是ufunc,它只是相关字符串方法的一个浅层 Package 器。
但是我们可以将add链接起来,就像我们做的那样('string_'+'0.01'+'_string'):

In [72]: np.char.add(np.char.add('string_',xx),'_string')
Out[72]: 
array(['string_0.1_string', 'string_0.2_string', 'string_0.3_string'],
      dtype='<U19')


numpy没有处理字符串的特殊代码,因此char函数的运行速度通常与列表解析相同。
有一个char.join,但它对数组的字符进行操作:

In [74]: np.char.join('_',xx)
Out[74]: array(['0_._1', '0_._2', '0_._3'], dtype='<U5')


另一种方法是将np.vectorizenp.frompyfunc与效用函数一起使用,如:

In [75]: def foo(i):
    ...:     return '_'.join(['string',str(i),'string'])
    ...:     

In [76]: np.frompyfunc(foo,1,1)(x)
Out[76]: 
array(['string_0.1_string', 'string_0.2_string', 'string_0.3_string'],
      dtype=object)


对于小数组,np.vectorize/frompyfunc往往比列表解析慢一点,但对于大数组,它们的伸缩性更好。
但主要的优点是,他们处理多个维度和广播。

相关问题