最近关于使用require与::的问题引发了关于在R中编程时使用哪种编程风格的问题,以及它们的优点/缺点.浏览源代码或在网上浏览,您会看到许多不同的样式显示.
我的代码中的主要趋势:
重度矢量化我使用索引(和嵌套索引)玩了很多,这有时会产生相当模糊的代码,但通常比其他解决方案快得多.例如:x[x < 5] <- 0而不是x <- ifelse(x < 5, x, 0)
我倾向于嵌套函数以避免使用我需要清理的临时对象来重载内存.特别是对于操纵大型数据集的函数,这可能是一个真正的负担.例如:y <- cbind(x,as.numeric(factor(x)))而不是y <- as.numeric(factor(x)) ; z <- cbind(x,y)
我编写了很多自定义函数,即使我只在例如一次使用代码.一个sapply.我相信它可以让它更容易阅读,而不会产生可以保持躺着的物体.
我不惜一切代价避免循环,因为我认为矢量化更清洁(更快)
然而,我注意到对此的看法不同,有些人倾向于背弃他们所谓的"Perl"编程方式(甚至是"Lisp",所有这些括号都在我的代码中飞来飞去.我不知道虽然走得那么远.
您认为R中的良好编码实践是什么?
您的编程风格是什么,您如何看待它的优缺点?
是否有用于学习英特尔SSE和AVX指令的优秀C/C++教程或示例?
我在微软MSDN和英特尔网站上发现很少,但从基础知识中理解它会很棒.
在编译时gcc -O3,为什么以下循环没有矢量化(自动):
#define SIZE (65536)
int a[SIZE], b[SIZE], c[SIZE];
int foo () {
int i, j;
for (i=0; i<SIZE; i++){
for (j=i; j<SIZE; j++) {
a[i] = b[i] > c[j] ? b[i] : c[j];
}
}
return a[0];
}
Run Code Online (Sandbox Code Playgroud)
什么时候呢?
#define SIZE (65536)
int a[SIZE], b[SIZE], c[SIZE];
int foov () {
int i, j;
for (i=0; i<SIZE; i++){
for (j=i; j<SIZE; j++) {
a[i] += b[i] > c[j] ? b[i] : c[j];
}
}
return a[0];
}
Run Code Online (Sandbox Code Playgroud)
唯一的区别在于内部循环中的表达式的结果是 …
我想尽可能快地计算相同维度的两个矩阵的行方点积.这就是我这样做的方式:
import numpy as np
a = np.array([[1,2,3], [3,4,5]])
b = np.array([[1,2,3], [1,2,3]])
result = np.array([])
for row1, row2 in a, b:
result = np.append(result, np.dot(row1, row2))
print result
Run Code Online (Sandbox Code Playgroud)
当然输出是:
[ 26. 14.]
Run Code Online (Sandbox Code Playgroud) numpy.vectorize 取函数f:a-> b并将其变为g:a [] - > b [].
这在标量a和b标量时都可以正常工作,但是我想不出为什么它不能用b作为ndarray或列表,即f:a-> b []和g:a [] - > b [] []
例如:
import numpy as np
def f(x):
return x * np.array([1,1,1,1,1], dtype=np.float32)
g = np.vectorize(f, otypes=[np.ndarray])
a = np.arange(4)
print(g(a))
Run Code Online (Sandbox Code Playgroud)
这会产生:
array([[ 0. 0. 0. 0. 0.],
[ 1. 1. 1. 1. 1.],
[ 2. 2. 2. 2. 2.],
[ 3. 3. 3. 3. 3.]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
好的,所以给出了正确的值,但错误的dtype.更糟糕的是:
g(a).shape
Run Code Online (Sandbox Code Playgroud)
收益率:
(4,)
Run Code Online (Sandbox Code Playgroud)
所以这个阵列几乎没用.我知道我可以将其转换为:
np.array(map(list, a), dtype=np.float32)
Run Code Online (Sandbox Code Playgroud)
给我我想要的东西:
array([[ 0., …Run Code Online (Sandbox Code Playgroud) 一些高中数学概念已被遗忘,所以我在这里问.
如果我有两点p1(x1,y1),p2(x2,y2)的方向P1-->p2,这是p1指向p2.由向量表示这个方向,它是Vector(x2-x1,y2-y1)或Vector(x1-x2, y1-y2)?
顺便说一下,规范化矢量的目的是什么?
我有一个data.frame列"a"和"b".我想添加名为"high"和"low"的列,其中包含a和b列中的最高和最低.
有没有办法在没有循环数据框中的行的情况下执行此操作?
编辑:这是针对OHLC数据的,因此高和低列应包含同一行上a和b之间的最高和最低元素,而不是整列.对不起,如果措辞不好.
我有一组n个向量存储在3 xn矩阵中z.我找到了外用产品np.einsum.当我使用时间计时:
%timeit v=np.einsum('i...,j...->ij...',z,z)
Run Code Online (Sandbox Code Playgroud)
我得到了结果:
The slowest run took 7.23 times longer than the fastest. This could mean that an
intermediate result is being cached
100000 loops, best of 3: 2.9 µs per loop
Run Code Online (Sandbox Code Playgroud)
这里发生了什么,可以避免吗?最好的3是2.9us,但最慢可能更典型.
T(i) = Tm(i) + (T(i-1)-Tm(i))**(-tau(i))
Run Code Online (Sandbox Code Playgroud)
Tm并且tau是先前已经计算过的具有相同长度的NumPy向量,并且期望创建新向量T.在i它只是为了说明什么是想要的元素索引.
这种情况需要for循环吗?
numpy中vectorize和frompyfunc有什么区别?
两者看起来非常相似.每个人的典型用例是什么?
编辑:正如JoshAdel所指出的,这个课程vectorize似乎是建立在上面的frompyfunc.(见来源).我还不清楚是否frompyfunc可能有任何未被vectorize...... 覆盖的用例
vectorization ×10
numpy ×5
python ×3
arrays ×2
r ×2
avx ×1
benchmarking ×1
c ×1
coding-style ×1
dot-product ×1
gcc ×1
intel ×1
ipython ×1
loops ×1
math ×1
max ×1
minimum ×1
scipy ×1
sse ×1
vector ×1