我有一个数组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")
而没有循环?
答案 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']
这假定a
和s
的长度相等,因为未另行指定