创建一个字母重复另一个数组给定次数的数组

时间:2019-03-27 21:19:38

标签: python numpy

我有一个数组a,我想用另一个字符串b创建另一个数组a,重复的次数由a = np.array([1,2,3]) s = 'a' 指定

b

我希望np.array(['a','aa','aaa'])a = np.array([1,2,3]) s = np.array(['a','b','c']) 。没有循环的麻木方式是什么?

虽然我的用例不需要它,但总的来说

b

如何使np.array(['a','bb','ccc'])成为date_seq <- function(start,end) { date_vec <- seq.Date( from = as.Date(paste0(gsub("M", "-", start),"-01")), to = as.Date(paste0(gsub("M", "-", end), "-01")), by = "m") return(format(date_vec, "%YM%m")) } date_seq("2015M04" ,"2019M08") 而没有循环?

3 个答案:

答案 0 :(得分:6)

有一个内置方法:

output = np.core.defchararray.multiply(s,a)

答案 1 :(得分:2)

让我们比较一下备选方案:

In [495]: a = np.array([1, 2, 3]) 
     ...: s = np.array(['a', 'b', 'c'])                                         

使用np.char函数。在幕后,这将字符串乘以数组的每个元素(带有循环):

In [496]: np.char.multiply(s,a)                                                 
Out[496]: array(['a', 'bb', 'ccc'], dtype='<U3')

一个显式循环。 i.item()将numpy字符串转换为Python字符串:

In [498]: np.array([i.item()*j for i,j in zip(s,a)])                            
Out[498]: array(['a', 'bb', 'ccc'], dtype='<U3')

创建Python字符串数组的另一种方法:

In [499]: s.astype(object)*a                                                    
Out[499]: array(['a', 'bb', 'ccc'], dtype=object)

时间:

In [500]: timeit np.char.multiply(s,a)                                          
21.3 µs ± 975 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [501]: timeit np.array([i.item()*j for i,j in zip(s,a)])                     
13.4 µs ± 21.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [502]: timeit s.astype(object)*a                                             
9.16 µs ± 226 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

因此显式循环方法效果很好。

另一个想法-使用frompyfunc

In [504]: np.frompyfunc(lambda i,j: i*j, 2,1)(s,a)                              
Out[504]: array(['a', 'bb', 'ccc'], dtype=object)
In [505]: timeit np.frompyfunc(lambda i,j: i*j, 2,1)(s,a)                       
6.28 µs ± 56 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

我想到frompyfunc是因为我想知道我们是否可以使用广播:

In [508]: np.frompyfunc(lambda i,j: i*j, 2,1)(s,a[:,None])                      
Out[508]: 
array([['a', 'b', 'c'],
       ['aa', 'bb', 'cc'],
       ['aaa', 'bbb', 'ccc']], dtype=object)

但是这种广播也适用于其他方法。

np.vectorize使用np.frompyfunc,但会进行dtype转换(frompyfunc总是返回对象dtype),但它往往会变慢。

答案 2 :(得分:0)

我不明白您为什么坚持说它们是numpy个对象?也许我误解了这个问题,但是您将以与列表相同的方式来处理它:

import numpy as np
a = np.array([1, 2, 3])
s = np.array(['a', 'b', 'c'])
new_array = np.array([str(s[i])*a[i] for i in range(len(s))])
print(new_array)

输出:

  

['a','bb','ccc']

这假定as的长度相等,因为未另行指定