可能重复:
使用先前的非NA值在向量中填充NA?
是否有一种惯用的方法可以在R向量中"向下"复制单元格值?通过"复制",我的意思是用最接近的先前非NA值替换NA.
虽然我可以使用for循环非常简单地执行此操作,但它运行速度非常慢.关于如何矢量化的任何建议将不胜感激.
# Test code
# Set up test data
len <- 1000000
data <- rep(c(1, rep(NA, 9)), len %/% 10) * rep(1:(len %/% 10), each=10)
head(data, n=25)
tail(data, n=25)
# Time naive method
system.time({
data.clean <- data;
for (i in 2:length(data.clean)){
if(is.na(data.clean[i])) data.clean[i] <- data.clean[i-1]
}
})
# Print results
head(data.clean, n=25)
tail(data.clean, n=25)
Run Code Online (Sandbox Code Playgroud)
试运行结果:
> # Set up test data
> len <- 1000000
> data <- rep(c(1, rep(NA, 9)), len %/% 10) * rep(1:(len %/% …Run Code Online (Sandbox Code Playgroud) 我有一个大小为139 X 143896的矩阵.
我必须从中删除6000列.
目前我正在使用for循环来做它并且它真的很慢.
有没有更快的方法来做到这一点?
for i=1:length(ind)
%ind are the indices of the columns to be removed
col1=ind(i);
mat(:,col1)=[];
end
Run Code Online (Sandbox Code Playgroud)
非常欢迎任何帮助.
我正在尝试编写一个函数,如果列表元素小于列表中的任何先前值,则会将列表元素添加到另一个列表中.我有一个非矢量化的版本:
myList <- c(14, 35, 12, 54, 67, 8, 32, 3, 78)
minVec <- function(x){
# Return a list of all numbers from x which are less than any previous number in the list
outList <- list(x[1])
for(i in 2:length(x)){
if(x[i] < min(x[1:i - 1])){
outList <- c(outList, x[i])}
}
return(unlist(outList))
}
minVec(myList)
Run Code Online (Sandbox Code Playgroud)
但我需要在很多列表上多次这样做,我想用lapply加速它.问题是,对于n列表的每个元素,x我需要能够找到子集的min x[1:n - 1].这可以用lapply(或其他矢量化)来完成吗?我怎么说"对于这个列表的每个元素,如果元素小于列表中的任何先前值,则将元素添加到新列表"?
任何人都可以帮我解决以下表达式:
8 x 8
8 x 88
8 x 888
8 x 8888
8 x 88888
我将使用R编程来进行计算.但是没有一种方法均可以使用代码本计算与具有没有逗号和括号内的单个R的表达(即{}的使用,和).
无论如何通过矢量化来做到这一点,而不使用条件语句(if,while,for)?
我在C中使用向量内部操作编写了一个简单的向量添加程序.这里我加载2个向量并添加它们,最后将结果向量存储回全局内存.
当我检查汇编代码时,它具有以下顺序的指令
movdqa 0(%rbp,%rax), %xmm7
paddd (%r12,%rax), %xmm7
movdqa %xmm7, (%rbx,%rax)
Run Code Online (Sandbox Code Playgroud)
如您所见,它只将paddd指令的一个操作数移动到寄存器(xmm7).在paddd指令中,第一个操作数指的是全局存储器中的地址,而不是先将寄存器移到寄存器中.
这是否意味着当paddd执行时,它首先从全局内存中移动到寄存器,然后添加两个寄存器中的操作数?这相当于以下代码序列
movdqa 0(%rbp,%rax), %xmm7
movdqa 0(%r12,%rax), %xmm8
paddd %xmm8, %xmm7
movdqa %xmm7, (%rbx,%rax)
Run Code Online (Sandbox Code Playgroud)
如果您需要更多信息(如可编译程序),请告诉我们,以便您自己生成程序集.
我正在尝试将一个向量加载到SSE寄存器中,我的代码编译没有错误,但是当我尝试运行它时,我有分段错误.这是我的代码:
inline int SSEJaccard::calcSSEJaccardDist(unsigned int id1, unsigned int id2) {
int result;
__m128i v, v1;
std::vector<uint32_t> &fv1 = fvs[id1];
std::vector<uint32_t> &fv2 = fvs[id2];
v = _mm_load_si128((__m128i const*) (&fv1));
v1 = _mm_load_si128((__m128i const*) (&fv2));
v = _mm_and_si128(v,v1);
result =_mm_extract_epi16(v, 0) + _mm_extract_epi16(v, 4);
return result;
}
Run Code Online (Sandbox Code Playgroud)
fsv是一个全局变量,定义如下:
std::vector<std::vector<uint32_t> > fvs;
Run Code Online (Sandbox Code Playgroud)
我正在使用英特尔编译器(ICC).谢谢
我想从矩阵中选择不同数量的第一个元素.数字在数组中指定.结果是一维数组.例如:
a = np.arange(25).reshape([5, 5])
numbers = np.array([3, 2, 0, 1, 2])
Run Code Online (Sandbox Code Playgroud)
我想要这个结果:
[0, 1, 2, 5, 6, 15, 20, 21]
Run Code Online (Sandbox Code Playgroud)
没有for循环.
我将使用数学库对数组进行一些计算.
我试过这样的事情:
import numpy as np
import math
a = np.array([0, 1, 2, 3])
a1 = np.vectorize(a)
print("sin(a) = \n", math.sin(a1))
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用.发生错误:"TypeError: must be real number, not vectorize".
如何使用矢量化函数来计算那种东西?
我需要以有效的方式在Haskell中对向量的元素应用函数,这意味着我不是在寻找这样的东西:
sigmoid :: [Float] -> [Float]
sigmoid [] = []
sigmoid (z:zs) = ( 1/(1+exp (-z)) ):(sigmoid zs)
Run Code Online (Sandbox Code Playgroud)
更具体地说,是否exp, log, ... etc使用Haskell在hmatrix中进行元素方向向量操作,类似于使用Python的numpy中的对应方式?如果我不使用矢量处理功能,我的代码运行速度非常慢.
我对向量化了解不多,但是我想了解为什么像python这样的语言无法通过库接口在可迭代对象上提供向量化,就像它提供线程支持一样。我知道许多numpy方法都是矢量化的,但是对于通用计算必须使用numpy可能会受到限制。
我目前的理解是,即使python与“ SIMD”模式匹配,它们也无法向量化它们。例如,理论上不应该对列表的理解或对该map()函数的使用进行矢量化处理,因为它们会输出一个列表,这是对来自输入列表的独立输入运行相同功能的结果吗?
凭着我的敏锐理解,似乎map()从理论上讲,无论何时我使用,我都应该能够创建一个代表该功能的指令集。那么输入中的每个元素只需通过已编译的同一函数运行即可。设计一种工具的技术挑战是什么,该工具会simd_map(func, iterable)尝试func“及时” 编译,然后从iterable处理器中提取批输入并利用处理器的simd功能来运行这些批处理func()?
谢谢!
python parallel-processing simd vectorization python-multiprocessing