如何用numpy.repeat实现R脚本的重复值生成,解决数组报错
R转Python脚本问题解决
需求与问题
需要将以下R脚本转换为Python代码,同时解决转换过程中遇到的警告和错误:
原R脚本
# set value for k k <- 3 # script 1 R cnt <- c(1,-1, rep(0,k-2)) print(cnt) # 输出:1 -1 0 # script 2 R for (i in 2:(k-1)) { cnt <- c(cnt, c(rep(0,(i-1)),1,-1,rep(0,(k-i-1)))) } print(cnt) # 输出:1 -1 0 0 1 -1
尝试的Python代码及问题
- 第一个脚本的尝试代码(出现DeprecationWarning):
import numpy as np k = 3 # code 1 Python pcnt = np.array([1, -1, np.repeat('0', k-2)], dtype=int) print(pcnt) # 输出:[ 1 -1 0],但有DeprecationWarning
- 第二个脚本的尝试代码(出现ValueError,改dtype='object'结果不符合预期):
import numpy as np k = 3 # code 2 Python for i in range(2, k-1+1): pcnt2 = np.array([np.repeat(0, (i-1)), 1, -1, np.repeat(0, (k-i-1))], dtype='int') print(pcnt2)
需要得到两个正确数组:第一个为[1,-1,0],第二个为[0,1,-1](或完整复现R脚本2的拼接结果)。
解决方案
1. 解决第一个脚本的DeprecationWarning
问题根源:将np.repeat返回的数组与标量直接放入np.array(),会创建嵌套数组,强制转换类型时触发警告。正确做法是用np.concatenate(或np.hstack)将所有部分合并为一维数组:
import numpy as np k = 3 # 正确实现script 1 pcnt = np.concatenate([[1, -1], np.repeat(0, k-2)]) print(pcnt) # 输出:array([ 1, -1, 0])
也可以用更直观的方式初始化数组后赋值:
pcnt = np.zeros(k, dtype=int) pcnt[0] = 1 pcnt[1] = -1 print(pcnt) # 输出:array([ 1, -1, 0])
2. 解决第二个脚本的ValueError并得到正确结果
问题根源:np.array()无法直接将数组和标量混合创建一维数组,需用np.concatenate拼接所有片段:
若仅需生成循环中的单个片段(即[0,1,-1]):
import numpy as np k = 3 for i in range(2, k): # range(2, k-1+1)等价于range(2,3) pcnt2 = np.concatenate([ np.repeat(0, i-1), [1, -1], np.repeat(0, k - i - 1) ]) print(pcnt2) # 输出:array([0, 1, -1])
若需完整复现R脚本2的拼接逻辑(得到[1,-1,0,0,1,-1]):
import numpy as np k = 3 # 初始化第一个脚本的结果 pcnt = np.concatenate([[1, -1], np.repeat(0, k-2)]) # 执行循环拼接 for i in range(2, k): new_segment = np.concatenate([ np.repeat(0, i-1), [1, -1], np.repeat(0, k - i - 1) ]) pcnt = np.concatenate([pcnt, new_segment]) print(pcnt) # 输出:array([ 1, -1, 0, 0, 1, -1])
内容的提问来源于stack exchange,提问作者GSA
相关产品推荐
相关产品推荐

