我想颠倒NumPy数组的每个字符串元素中的字符顺序。例如,给定以下输入:
array(['2', '3', '5', '7', '11', '13', '17', '19', '23', '29', '31', '37',
'41', '43', '47', '53', '59', '61', '67', '71', '73', '79', '83',
'89', '97'], dtype='<U2')
我想获得以下输出(不使用Python for
循环):
array(['2', '3', '5', '7', '11', '31', '71', '91', '32', '92', '13', '73',
'14', '34', '74', '35', '95', '16', '76', '17', '37', '97', '38',
'98', '79'], dtype='<U2')
我知道我可以使用arr[::-1]
来颠倒NumPy数组中元素的顺序,但这不是这个问题的主题,而且np.array([e[::-1] for e in arr])
效率低下,与NumPy的观点背道而驰。
该数组是使用基本转换函数np.vectorize(to_base_str)
的矢量化版本创建的。
如何使用向量化反转NumPy数组的每个字符串元素中的字符顺序?我在网上找过,但没有找到解决办法。注意arr[..., ::-1]
不适用于NumPy数组中的字符串元素。
(Code是我的,但我确实使用了“AI建议编辑”功能)
2条答案
按热度按时间jk9hmnmh1#
np.array([e[::-1] for e in arr])
是这样做的直接方法,并且不是坏的numpy
。或者用[e[::-1] for e in arr.tolist()]
完全绕过numpy。您也可以对np.vectorize
或np.frompyfunc
执行类似的操作。这些可能会扩展得更好一点。numpy
中的“vectorize”意味着使用编译方法(和运算符)在编译代码中进行必要的迭代。这些几乎都是数字运算。对于字符串,numpy
使用Python字符串方法。它没有自己的编译字符串操作。甚至np.char
函数也使用python字符串方法。所以没有
numpy
等价于astr[::-1]
。一些比较时代
klsxnrf12#
下面的代码通过考虑原始数组的不同视图来完成这项工作。这意味着不需要额外的数组(以及内存)。No for loops:)
对于短数组,比如你给出的那个,@hpaulj的答案更快。但是对于更大的数组,这种方法更快。例如,对于100,000个元素的数组,与@hpaulj的最快方法(
[s[::-1] for s in arr.tolist()]
)相比,该方法快了大约5倍。