Raw*_*oob 5 python numpy r recycle
我想找到与R rep和rep_len函数等效的python(可能是numpy)。
问题1:关于rep_len功能,说我跑了,
rep_len(paste('q',1:4,sep=""), length.out = 7)
Run Code Online (Sandbox Code Playgroud)
那么vector的元素['q1','q2','q3','q4']将被回收以填满7个空格,您将获得输出
[1] "q1" "q2" "q3" "q4" "q1" "q2" "q3"
Run Code Online (Sandbox Code Playgroud)
如何回收列表或一维numpy数组的元素以适合预定长度?从我已经看到的numpy的重复功能可以让您指定一定次数的代表,但不会重复值以填充预定长度。
问题2:关于rep功能,说我跑了,
rep(2000:2004, each = 3, length.out = 14)
Run Code Online (Sandbox Code Playgroud)
那么输出是
[1] 2000 2000 2000 2001 2001 2001 2002 2002 2002 2003 2003 2003 2004 2004
Run Code Online (Sandbox Code Playgroud)
如何使用python做到这一点(回收列表或numpy数组的元素以适合预定长度并连续列出每个元素预定次数)?
如果这个问题以前曾被问过,我深表歉意。对于堆栈溢出,我是完全陌生的,对于编程而言,我是非常陌生的。
NumPy实际上确实提供的等效项rep_len。是numpy.resize:
new_arr = numpy.resize(arr, new_len)
Run Code Online (Sandbox Code Playgroud)
请注意,该resize 方法使用零填充而不是重复元素,因此arr.resize(new_len)不会执行您想要的操作。
至于rep,我知道没有等效的。有numpy.repeat,但不允许您限制输出的长度。(还有numpy.tile重复全矢量功能,但同样,没有length.out等效功能。)您可以对结果进行切片,但仍会花费所有时间和内存来生成未截断的数组:
new_arr = numpy.repeat(arr, repetitions)[:new_len]
Run Code Online (Sandbox Code Playgroud)
小智 5
numpy.repeat() 的作用类似于 R 的rep()函数,其中each=True。当each=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)
Run Code Online (Sandbox Code Playgroud)
例如,如果我们设置each=True:
np_rep(np.array(['tinny', 'woody', 'words']), reps=3, each=True)
Run Code Online (Sandbox Code Playgroud)
...我们得到:
array(['tinny', 'tinny', 'tinny', 'woody', 'woody', 'woody', 'words', 'words', 'words'],
dtype='<U5')
Run Code Online (Sandbox Code Playgroud)
但是当each=False时:
np_rep(np.array(['tinny', 'woody', 'words']), reps=3, each=False)
Run Code Online (Sandbox Code Playgroud)
...结果是:
array(['tinny', 'woody', 'words', 'tinny', 'woody', 'words', 'tinny', 'woody', 'words'],
dtype='<U5')
Run Code Online (Sandbox Code Playgroud)
请注意,x 被展平,结果也被展平。为了实现长度参数,需要计算所需的最小重复次数,然后将结果截断为所需的长度。
对于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')
Run Code Online (Sandbox Code Playgroud)
对于rep方法,numpy 的等价物是numpy.repeat,你还需要实现length.outwith slice:
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')
Run Code Online (Sandbox Code Playgroud)