相当于R rep和rep_len函数的Python numpy

Raw*_*oob 5 python numpy r recycle

我想找到与R reprep_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数组的元素以适合预定长度并连续列出每个元素预定次数)?

如果这个问题以前曾被问过,我深表歉意。对于堆栈溢出,我是完全陌生的,对于编程而言,我是非常陌生的。

use*_*ica 5

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 被展平,结果也被展平。为了实现长度参数,需要计算所需的最小重复次数,然后将结果截断为所需的长度。


Psi*_*dom 3

对于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)