Skip to main content
 首页 » 编程设计

python之是否可以使用 numpy 乘法将字符串乘以整数

2025年05月04日27leader

我正在尝试按元素将两个数组相乘以形成一个字符串。

谁能给个建议?

import numpy as np 
 
 
def array_translate(array): 
 
    intlist = [x for x in array if isinstance(x, int)] 
    strlist = [x for x in array if isinstance(x, str)] 
    joinedlist = np.multiply(intlist, strlist) 
    return "".join(joinedlist) 
 
 
print(array_translate(["Cat", 2, "Dog", 3, "Mouse", 1]))    # => "CatCatDogDogDogMouse" 

我收到此错误:

File "/Users/peteryoon/PycharmProjects/Test3/Test3.py", line 8, in array_translate 
    joinedlist = np.multiply(intlist, strlist) 
numpy.core._exceptions.UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U21'), dtype('<U21')) -> dtype('<U21') 

我能够使用下面的列表理解来解决。但很想知道 numpy 是如何工作的。

def array_translate(array): 
 
    intlist = [x for x in array if isinstance(x, int)] 
    strlist = [x for x in array if isinstance(x, str)] 
    return "".join(intlist*strlist for intlist, strlist in zip(intlist, strlist)) 
 
 
print(array_translate(["Cat", 2, "Dog", 3, "Mouse", 1]))    # => "CatCatDogDogDogMouse" 

请您参考如下方法:

In [79]: arr = np.array(['Cat','Dog','Mouse'])                                   
In [80]: cnt = np.array([2,3,1])   

各种替代方案的时间安排。相对位置可能因数组的大小而异(以及您是从列表还是数组开始)。所以做你自己的测试:

In [93]: timeit ''.join(np.repeat(arr,cnt))                                      
7.98 µs ± 57.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
 
In [94]: timeit ''.join([str(wd)*i for wd,i in zip(arr,cnt)])                    
5.96 µs ± 167 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
 
In [95]: timeit ''.join(arr.astype(object)*cnt)                                  
13.3 µs ± 50.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
 
In [96]: timeit ''.join(np.char.multiply(arr,cnt))                               
27.4 µs ± 307 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each) 
 
In [100]: timeit ''.join(np.frompyfunc(lambda w,i: w*i,2,1)(arr,cnt))            
10.4 µs ± 164 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
 
In [101]: %%timeit f = np.frompyfunc(lambda w,i: w*i,2,1)  
     ...: ''.join(f(arr,cnt))                                                                        
7.95 µs ± 93.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each) 
 
In [102]: %%timeit x=arr.tolist(); y=cnt.tolist()  
     ...: ''.join([str(wd)*i for wd,i in zip(x,y)])                                                                       
1.36 µs ± 39.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each) 

np.repeat 适用于所有类型的数组。

列表理解使用字符串乘法,不应该被忽视。通常它是最快的,尤其是从列表开始时。

Object dtype 将字符串 dtype 转换为 Python 字符串,然后将操作委托(delegate)给字符串 multiply。

np.char 将字符串方法应用于数组元素。虽然方便,但速度很少。

编辑

In [104]: timeit ''.join(np.repeat(arr,cnt).tolist())                            
4.04 µs ± 197 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)