小编bsd*_*ish的帖子

在Scala中使用zipWith(映射多个Seq)

假设我有

val foo : Seq[Double] = ...
val bar : Seq[Double] = ...
Run Code Online (Sandbox Code Playgroud)

我希望产生一个seq,其中baz(i)= foo(i)+ bar(i).我能想到的一种方法是

val baz : Seq[Double] = (foo.toList zip bar.toList) map ((f: Double, b : Double) => f+b)
Run Code Online (Sandbox Code Playgroud)

然而,这感觉既丑陋又低效 - 我必须将seqs转换为列表(使用惰性列表进行爆炸),创建此临时元组列表,仅映射它并让它进行GCed.也许溪流解决了懒惰的问题,但无论如何,这感觉就像不必要的丑陋.在lisp中,map函数将映射多个序列.我会写的

(mapcar (lambda (f b) (+ f b)) foo bar)
Run Code Online (Sandbox Code Playgroud)

并且不会在任何地方创建临时列表.在Scala中是否存在map-over-multiple-lists函数,或者zip是否与解构相结合实际上是"正确"的方法?

functional-programming scala higher-order-functions

34
推荐指数
3
解决办法
2万
查看次数

IPython中的并行映射函数具有多个参数

我正在尝试使用IPython的并行环境,到目前为止,它看起来很棒,但我遇到了问题.让我们说我有一个在库中定义的函数

def func(a,b):
   ...
Run Code Online (Sandbox Code Playgroud)

当我想要评估a的一个值和b的一堆值时,我使用的.

[func(myA, b) for b in myLongList]
Run Code Online (Sandbox Code Playgroud)

显然,真正的功能更复杂,但问题的实质是它需要多个参数,我只想映射其中一个.问题是map,@ dview.parallel等映射了所有参数.

所以我想说我想得到func(myA,myLongList)的答案.这样做的显而易见的方法是咖喱,或者是functools.partial,或者是

dview.map_sync(lambda b: func(myA, b),   myLongList)
Run Code Online (Sandbox Code Playgroud)

但是,这在远程计算机上无法正常工作.原因是当lambda表达式被pickle时,myA的值不包括在内,而是使用远程机器上本地作用域的myA值.当闭包被腌制时,它们关闭的变量不会.

我能想到的两种实际工作方式是为每个参数手动构建列表,并对所有参数进行映射工作,

dview.map_sync(func, [myA]*len(myLongList), myLongList)   
Run Code Online (Sandbox Code Playgroud)

或者以恐怖的方式将数据用作函数的默认参数,强制它被腌制:

# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
    return func(myA, b)

dview.map_sync(parallelFunc, myLongList)
Run Code Online (Sandbox Code Playgroud)

真的,当真正的函数需要很多参数并且更复杂时,这一切似乎都非常扭曲.是否有一些惯用的方法呢?就像是

@parallel(mapOver='b')
def  bigLongFn(a, b):
   ...
Run Code Online (Sandbox Code Playgroud)

但据我所知,没有像'mapOver'这样的东西存在.我可能已经知道如何实现它...这只是一个非常基本的操作,应该存在支持,所以我想检查我是否遗漏了一些东西.

python parallel-processing ipython

34
推荐指数
3
解决办法
5779
查看次数

Scala中的抽象类型/类型参数

我正在尝试编写一些需要执行以下操作的Scala代码:

class Test[Type] { 
   def main {
       SomeFunc classOf[Type]
       val testVal: Type = new Type()
    }
 }
Run Code Online (Sandbox Code Playgroud)

而且它失败了.我显然不了解Scala泛型参数.显然,误解是在C++中,模板本质上就像字符串替换一样,所以只要传入的类具有默认构造函数,新的Type()就可以工作.但是,在Scala中,类型是不同类型的对象.

types scala

16
推荐指数
1
解决办法
4471
查看次数

一个bash one-liner,可以切换到某个文件所在的目录

我经常想要更改到特定可执行文件所在的目录.所以我喜欢类似的东西

cd `which python` 
Run Code Online (Sandbox Code Playgroud)

切换到安装python命令的目录.但是,这显然是非法的,因为cd占用目录,而不是文件.显然有一些regexp-foo我可以做的去除文件名,但这会打败它是一个简单的单行.

bash cd which

8
推荐指数
2
解决办法
572
查看次数

映射Scala中的子列表

我知道map函数接受列表的每个元素(一个序列)并将一个函数应用于它.递归(并且不考虑终止条件等)

map(s, f) = f(s.head) :: map(s.tail, f)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个像这样的功能

foo(s, f) = f(s) :: map(s.tail, f).
Run Code Online (Sandbox Code Playgroud)

所以'mapper'是在子列表而不是单个元素上调用映射函数的地方.在lisp术语中,我正在寻找一个地图列表,而不是mapcar.这样的事情是存在的,还是我必须自己滚动(或使用递归)?

或者,我将采用一个函数,将序列作为输入,并返回一系列中到端子序列,即

bar(s, f) = s :: bar(s.tail, f)
Run Code Online (Sandbox Code Playgroud)

functional-programming scala list-manipulation

6
推荐指数
1
解决办法
807
查看次数

R的GC和内存限制问题

我在一些相对较大的数据上使用R并且遇到了一些内存问题.这是在Linux上.我的数据明显少于系统上的可用内存,因此这是管理瞬态分配的问题.

当我运行gc()时,我得到以下列表

           used   (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells   2147186  114.7    3215540  171.8   2945794  157.4
Vcells 251427223 1918.3  592488509 4520.4 592482377 4520.3
Run Code Online (Sandbox Code Playgroud)

但是R似乎在驻留内存中分配了4GB,在交换中分配了2GB.我假设这是操作系统分配的内存,R的内存管理系统将根据需要分配和GC.但是,让我说我不想让R OS分配超过4gb,以防止交换抖动.我总是可以使用ulimit,但之后它会崩溃而不是在缩小的空间内工作并且更频繁地使用GCing.有没有办法为gc触发器指定任意最大值并确保R从不进行os分配更多?或者我还能做些什么来管理内存使用?

memory garbage-collection r

5
推荐指数
1
解决办法
1116
查看次数

汇总或汇总以获得比率

以下是一个玩具问题,可以解释我的问题.

我有一个包含大量员工的数据框; 对于每个员工,它有一个名称,工资,性别和州.

aggregate(salary ~ state)  # Returns the average salary per state
aggregate(salary ~ state + gender, data, FUN = mean)  # Avg salary per state/gender
Run Code Online (Sandbox Code Playgroud)

我实际需要的是每个州妇女所获总薪水的比例摘要.

aggregate(salary ~ state + gender, data, FUN = sum)  
Run Code Online (Sandbox Code Playgroud)

返回每个州的女性(和男性)所获得的总薪水,但我真正需要的是每州一级的salary_w/salary_total.我可以写一个for循环等 - 但我想知道是否有一些方法可以使用聚合来做到这一点.

aggregate r

5
推荐指数
2
解决办法
4307
查看次数

没有()的const访问器,或者对成员变量的const引用

我有兴趣创建一个我可以使用的类

class MyClass {
  vector<int> m_vec;
public:
  // Either this
  const& vector<int> vec;
  // Or some version of this. 
  const& vector<int> getVec() { return m_vec } ;

  MyClass() : vec(m_vec) {}
  void changeVec() { m_vec.push_back(5); }
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我想使用getVec(),语法有点麻烦:

myClass.getVec()[5]
Run Code Online (Sandbox Code Playgroud)

我更愿意能够以某种方式使用

myClass.vec[5]
Run Code Online (Sandbox Code Playgroud)

没有暴露修改载体的能力.IE,我希望成员变量是私有的,但是变量的const版本是公共的,没有语法或性能开销.

如果我添加const&vector引用,编译器(至少我的GCC版本)实际上会使该类占用更多内存.所以

  1. 如何在不使用更多内存的情况下为成员变量创建别名,或者
  2. 如何避免myVec()[]访问器中的parens?仅仅定义myVec(int idx)并不是一个令人满意的选择,因为我想在其上调用多个方法.

为了清楚起见,这是一个例子 - 在实际情况中,使用比矢量情况更具吸引力.此外,内存使用重要,因为存在大量这些对象并将被复制,因此这不是过早的优化.此时,我正在使用getVec()[0]方法,但是丑陋会让我感到害怕.

c++ reference accessor

4
推荐指数
1
解决办法
450
查看次数