我想找到蟒蛇(numpy是可能的) - 等同于R rep
和rep_len
函数。
问题1:关于rep_len
功能,比如我跑,
rep_len(paste('q',1:4,sep=""), length.out = 7)
那么矢量['q1','q2','q3','q4']
的元素将被回收以填充7个空格,你将获得输出
[1] "q1" "q2" "q3" "q4" "q1" "q2" "q3"
如何回收列表或1-d numpy数组的元素以适合预定长度?从我所看到的numpy的重复功能允许你指定一定数量的reps,但不重复值来填充预定的长度。
问题2:关于rep
功能,比如我跑,
rep(2000:2004, each = 3, length.out = 14)
那么输出就是
[1] 2000 2000 2000 2001 2001 2001 2002 2002 2002 2003 2003 2003 2004 2004
我怎么能使用python发生这个(列表或numpy数组的循环元素以适合预定长度并连续预定每个元素列出预定次数)?
如果以前曾问过这个问题,我道歉;我对堆栈溢出很新,对编程很新。
NumPy确实提供了相当于rep_len
。这是numpy.resize
:
new_arr = numpy.resize(arr, new_len)
请注意,resize
方法用零填充而不是重复元素,因此arr.resize(new_len)
不能做你想要的。
至于rep
,我知道没有相应的东西。有numpy.repeat
,但它不允许你限制输出的长度。 (还有numpy.tile
用于重复整个向量功能,但同样,没有length.out
等效。)你可以切片结果,但它仍然会花费所有时间和内存来生成未截断的数组:
new_arr = numpy.repeat(arr, repetitions)[:new_len]
对于rep_len
,类似的numpy方法是np.tile
,除了它没有提供length.out
参数;但您可以使用slice
轻松实现它:
x = ['q1', 'q2', 'q3', 'q4']
def np_rep_len(x, length_out):
return np.tile(x, length_out // len(x) + 1)[:length_out]
np_rep_len(x, 7)
# array(['q1', 'q2', 'q3', 'q4', 'q1', 'q2', 'q3'],
# dtype='<U2')
对于rep
方法,numpy等价物是numpy.repeat
,你还需要用切片实现length.out
:
def np_rep(x, repeat, length_out):
return np.repeat(x, repeat)[:length_out]
np_rep(x, 3, 10)
# array(['q1', 'q1', 'q1', 'q2', 'q2', 'q2', 'q3', 'q3', 'q3', 'q4'],
# dtype='<U2')
如果您愿意,可以使用乘法和切片与python内置隐式迭代的组合。 (我知道你想要一个numpy解决方案,但我只是认为这不会伤害...)
rep_len(paste('q',1:4,sep=""), length.out = 7)
转换为 - >
(["q"+str(k) for k in range(1,5)]*(7/4+1))[:7]
numpy.repeat()就像R的rep()函数一样,每个= True。当每个= False时,可以通过转置实现回收:
import numpy as np
def np_rep(x, reps=1, each=False, length=0):
""" implementation of functionality of rep() and rep_len() from R
Attributes:
x: numpy array, which will be flattened
reps: int, number of times x should be repeated
each: logical; should each element be repeated reps times before the next
length: int, length desired; if >0, overrides reps argument
"""
if length > 0:
reps = np.int(np.ceil(length / x.size))
x = np.repeat(x, reps)
if(not each):
x = x.reshape(-1, reps).T.ravel()
if length > 0:
x = x[0:length]
return(x)
例如,如果我们设置each = True:
np_rep(np.array(['tinny', 'woody', 'words'], reps=3, each=True)
......我们得到:
array(['tinny', 'tinny', 'tinny', 'woody', 'woody', 'woody', 'words', 'words', 'words'],
dtype='<U5')
但当每个=假:
np_rep(np.array(['tinny', 'woody', 'words']), reps=3, each=False)
......结果是:
array(['tinny', 'woody', 'words', 'tinny', 'woody', 'words', 'tinny', 'woody', 'words'],
dtype='<U5')
请注意,x会变平,结果也会变平。要实现length参数,计算所需的最小reps数,然后将结果截断为所需的长度。
在评论Psidom的np_rep函数时,我认为R的rep函数的另一个特性(使用each =参数)是它将重复向量中的元素,直到达到length.out指定的长度。例如,
rep(2000:2001, each = 4, length.out = 15)
回报
[1] 2000 2000 2000 2000 2001 2001 2001 2001 2000 2000 2000 2000 2001 2001[15] 2001
。在python中,定义np_rep为Psidom定义它,
def np_rep(x, repeat, length_out):
return np.repeat(x, repeat)[:length_out]
并打电话
np_rep(list(range(2000,2002)), repeat = 4, length_out = 15)
,输出是
array([2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001])
;所以函数不循环以达到所需的长度,但在参数x的元素重复参数重复次数后停止。
我相信以下内容应该作为一个包含回收的版本:
def repeat_recycle(x, repeat, length_out):
rep = lambda x,length_out,repeat:np.repeat(x,repeat)[:length_out]
repeated = rep(x, length_out, repeat)
if len(x)*repeat >= length_out:
return repeated
v = [None for i in range(length_out)]
n = len(repeated)
for i in range(length_out):
v[i] = repeated[i%n]
return np.array(v)
电话,
repeat_recycle(list(range(2000,2002)), repeat = 4, length_out = 15)
回报
array([2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2000, 2000, 2000,
2000, 2001, 2001, 2001])
,这是回收版本,填补了15个元素。
如果length_out不超过len(x)和repeat的乘积,它将默认为lambda形式的Psidom的np_rep函数。