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

pey*_*eyo 1 python numpy

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

有人可以建议吗?

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"
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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')
Run Code Online (Sandbox Code Playgroud)

我能够使用下面的列表理解来解决。但很好奇 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"
Run Code Online (Sandbox Code Playgroud)

hpa*_*ulj 5

In [79]: arr = np.array(['Cat','Dog','Mouse'])                                  \nIn [80]: cnt = np.array([2,3,1])  \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
In [93]: timeit ''.join(np.repeat(arr,cnt))                                     \n7.98 \xc2\xb5s \xc2\xb1 57.7 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [94]: timeit ''.join([str(wd)*i for wd,i in zip(arr,cnt)])                   \n5.96 \xc2\xb5s \xc2\xb1 167 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [95]: timeit ''.join(arr.astype(object)*cnt)                                 \n13.3 \xc2\xb5s \xc2\xb1 50.9 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [96]: timeit ''.join(np.char.multiply(arr,cnt))                              \n27.4 \xc2\xb5s \xc2\xb1 307 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 10000 loops each)\n\nIn [100]: timeit ''.join(np.frompyfunc(lambda w,i: w*i,2,1)(arr,cnt))           \n10.4 \xc2\xb5s \xc2\xb1 164 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [101]: %%timeit f = np.frompyfunc(lambda w,i: w*i,2,1) \n     ...: ''.join(f(arr,cnt))                                                                       \n7.95 \xc2\xb5s \xc2\xb1 93.2 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\nIn [102]: %%timeit x=arr.tolist(); y=cnt.tolist() \n     ...: ''.join([str(wd)*i for wd,i in zip(x,y)])                                                                      \n1.36 \xc2\xb5s \xc2\xb1 39.7 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

对象数据类型将字符串数据类型转换为Python字符串,然后将操作委托给字符串乘法。

\n\n

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

\n\n

编辑

\n\n
In [104]: timeit ''.join(np.repeat(arr,cnt).tolist())                           \n4.04 \xc2\xb5s \xc2\xb1 197 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n