嗨我正在尝试操作一个数字列表,我想这样做没有for循环,在R中使用快速本机操作.操作的伪代码是:
默认情况下,起始总数为100(对于零内的每个块)
从第一个零到下一个零,累计总数下降超过2%的时刻将所有后续数字替换为零.
在零之内完成所有数字块
累积总和每次都重置为100
例如,如果以下是我的数据:
d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
Run Code Online (Sandbox Code Playgroud)
结果将是:
0 0 0 1 3 4 5 -1 2 3 -5 0 0 0 -2 -3 0 0 0 0 0 -1 -1 -1 0
Run Code Online (Sandbox Code Playgroud)
目前我有一个for循环的实现,但由于我的向量很长,性能很糟糕.
提前致谢.
这是一个运行的示例代码:
d <- c(0,0,0,1,3,4,5,-1,2,3,-5,8,0,0,-2,-3,3,5,0,0,0,-1,-1,-1,-1);
ans <- d;
running_total <- 100;
count <- 1;
max <- 100;
toggle <- FALSE;
processing <- FALSE;
for(i in d){
if( i != 0 ){
processing <- TRUE;
if(toggle == TRUE){
ans[count] = 0;
}
else{
running_total = …Run Code Online (Sandbox Code Playgroud) 我有一个矩阵说
Z = [1 2 3;
4 5 6;
7 8 9]
Run Code Online (Sandbox Code Playgroud)
我必须将其值(例如位置(2,2)和(3,1))更改为某个指定值.我有两个矩阵rowNos和colNos含有这些位置:
rowNos = [2, 3]
colNos = [2, 1]
Run Code Online (Sandbox Code Playgroud)
假设我想将这些位置的元素值更改为0.
如何在不使用for循环的情况下完成它?
我正在尝试计算以下值:
1/N * sum[i=0 to N-1]( log(abs(r_i - 2 * r_i * x_i)) )
Run Code Online (Sandbox Code Playgroud)
其中x_i以递归方式计算:
x_{i+1} = r_i * x_i * (1 - x_i)
Run Code Online (Sandbox Code Playgroud)
在r_i给出所有s的情况下(尽管它们随之变化i),并且x_0给出了.(据我所知,没有一种棘手的数学方法可以将这种计算简化为非迭代公式,以加快它的速度).
我的问题是它很慢,我想知道一些外部视角是否可以帮助我加快速度.
# x0: a scalar. rs: a numeric vector, length N
# N: typically ~5000
f <- function (x0, rs, N) {
lambda <- 0
x <- x0
for (i in 1:N) {
r <- rs[i]
rx <- r * x
lambda <- lambda + …Run Code Online (Sandbox Code Playgroud) 我有以下两个清单:
First list:
[[1]]
[1] "ab" "iew" "rer" "fdd"
[[2]]
[1] "ff" "de
[[3]]
[1] "cc"
Second list:
[[1]]
[1] "iew" "vfr"
[[2]]
[1] "ff" "cdc"
[[3]]
[1] "vf" "cde"
Run Code Online (Sandbox Code Playgroud)
我的目标是比较这两个多维列表,结果将是:
[[1]]
[1] FALSE TRUE FALSE FALSE
[[2]]
[1] TRUE FALSE
[[3]]
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
预先形成此intersect()函数的最佳矢量化方法是什么?
鉴于我们有:
我想在没有循环的情况下评估以下代码:(或以更快的方式)
out = zeros(1,numSamples);
for i = 1:numSamples
res = sum(repmat(B - x(i,:), numSamples, 1)*A.*(x - repmat(x(i,:), numSamples, 1)), 2).^2;
out(i) = var(res);
end
Run Code Online (Sandbox Code Playgroud)
如果您对更快地改进上述内容有其他建议,那也非常受欢迎.
如果我们有一个3 x 3旋转矩阵R,它可以乘以v一个3 x N数组 - 一个N列向量数组- 来产生一个新3 x N的旋转向量数组,如下所示:
v_rotated = R.dot(v)
Run Code Online (Sandbox Code Playgroud)
现在假设我们有一个N x M x 3数组,N时间M向量,我想用N不同的3 x 3旋转矩阵旋转(向量的每个"行"一个旋转矩阵).这对循环来说很简单,但是有一种更快,更紧凑(矢量化)的方法,例如使用numpy's dot或tensorproduct?
循环实现的示例代码:
from numpy import cos, sin, array, pi, linspace, random
# 100 different rotation matrices:
R = [array([[1, 0, 0], [0, cos(theta), -sin(theta)], [0, sin(theta), cos(theta)]]) for theta in linspace(0, pi, 100)] …Run Code Online (Sandbox Code Playgroud) 在下面的代码中,y1和y2应该相等,但它们不是.vectorize()或dot()中可能有错误吗?
import numpy as np
interval = np.arange(0, 30, 0.1)
y1 = [- 1.57 * max(0, x - 10) - 0.72 * max(0, 15 - x)
- 1.09 * max(0, 20 - x) for x in interval]
def fun(x, pivot, truth):
if truth: return max(0, x - pivot)
else: return max(0, pivot - x)
pivots = [10, 15, 20]
truths = [ 1, 0, 0]
coeffs = [-1.57, -0.72, -1.09]
y2 = [np.dot(np.vectorize(fun)(x, pivots, truths), coeffs) for x in interval] …Run Code Online (Sandbox Code Playgroud) 我有两个向量
data vector: A = [1 2 2 1 2 6; 2 3 2 3 3 5]
label vector: B = [1 2 1 2 3 NaN]
Run Code Online (Sandbox Code Playgroud)
我想取所有具有相同标签的列的平均值,并将它们输出为按标签号排序的矩阵,忽略NaN.所以,在这个例子中我想要:
labelmean(A,B) = [1.5 1.5 2; 2 3 3]
Run Code Online (Sandbox Code Playgroud)
这可以通过像这样的for循环来完成.
function out = labelmean(data,label)
out=[];
for i=unique(label)
if isnan(i); continue; end
out = [out, mean(data(:,label==i),2)];
end
Run Code Online (Sandbox Code Playgroud)
但是,我正在处理包含许多数据点和标签的巨大数组.此外,此代码段将经常执行.我想知道是否有更有效的方法来做到这一点,而不是遍历每个单独的标签.
考虑以下代码,其中a是一个参数数组,float并且s是一个最初未初始化的结果数组float:
s[n - 1] = mu * a[n - 1];
for (int j = n - 2; j >= 0; j--)
s[j] = mu * (a[j] + s[j + 1]);
return s;
Run Code Online (Sandbox Code Playgroud)
有没有机会用SIMD(AVX2)改善这种重复代码的性能?
编辑:我后来发现这个公式/算法被称为"折扣金额",但无法在互联网上找到它的并行版本.
我有一部分数据框df是这样的:
| nr | Time | Event |
|----|------|-------|
| 70 | 8 | |
| 70 | 0 | |
| 70 | 0 | |
| 74 | 52 | |
| 74 | 12 | |
| 74 | 0 | |
Run Code Online (Sandbox Code Playgroud)
我想将事件分配到最后一列。默认情况下,第一个条目是1。
If Time[i] < 7 and nr[i] != nr[i-1], then Event[i]=Event[i-1]+1.
If Time[i] < 7 and nr[i] = nr[i-1], then Event[i]=Event[i-1]
If Time[i] > 7 then Event[i]=Event[i-1]+1.
Run Code Online (Sandbox Code Playgroud)
如何有效地向量化?我想避免循环。