小编Joe*_*Joe的帖子

使用joblib.Parallel时,为什么保护主循环很重要?

joblib文档包含以下警告:

在Windows下,保护代码的主循环非常重要,以避免在使用joblib.Parallel时递归生成子进程.换句话说,您应该编写如下代码:

import ....

def function1(...):
    ...

def function2(...):
    ...

... if __name__ == '__main__':
    # do stuff with imports and functions defined about
    ...
Run Code Online (Sandbox Code Playgroud)

没有代码应该在"if __name__ =='__ main__'"块之外运行,只有导入和定义.

最初,我认为这只是为了防止偶然的奇怪情况,其中函数传递给joblib.Parallel递归调用模块,这意味着它通常是良好的做法,但通常是不必要的.但是,对我而言,为什么这只会对Windows造成风险是没有意义的.此外,这个答案似乎表明,无法保护主循环导致代码运行速度比非常简单的非递归问题慢几倍.

出于好奇,我从joblib文档中运行了一个非常简单的尴尬并行循环示例,而没有保护Windows框中的主循环.我的终端被垃圾邮件发送以下错误,直到我关闭它:

ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not suppo
rt forking. To use parallel-computing in a script, you must protect you main loop using "if __name__ == '__main__'". Ple
ase see the joblib documentation on Parallel …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing joblib

19
推荐指数
2
解决办法
1万
查看次数

在基组之间切换时是否可以在多个图例之间切换?

我正在使用r中的传单可视化一些矢量数据,其中包含用户可能感兴趣的多个非空间变量。我想允许用户选择一个确定要素颜色的变量。我通过函数的baseGroups参数来完成此操作addLayersControl,其中每个组都是具有不同调色板的相同数据。这工作正常切换的特征本身的颜色,但不允许我之间legends-每一个传说我添加始终显示切换,即使我使用适当的group范围内addLegend。请参见下面的示例代码和屏幕截图:

data <- data.frame(long = c(-93.2, -93, -93.5), lat = c(44.9, 45, 44.9), 
               var1 = c(1,2,3), var2 = c(10, 9, 1))

pal1 <- colorNumeric(palette = "Blues", domain = data$var1)
pal2 <- colorNumeric(palette = "Reds", domain = data$var2)

leaflet(data) %>%
  addCircleMarkers(color = ~pal1(var1), group = "var1") %>%
  addCircleMarkers(color = ~pal2(var2), group = "var2") %>%
  addLegend(pal = pal1, values = ~var1, group = "var1") %>%
  addLegend(pal = pal2, values = ~var2, group = "var2") …
Run Code Online (Sandbox Code Playgroud)

r leaflet r-leaflet

13
推荐指数
1
解决办法
354
查看次数

根据任意标准嵌套平面列表

我有一个独特对象的平面列表,其中一些可能与其他对象共享一个给定的属性.我希望创建一个嵌套的列表列表,其中对象按给定属性分组.作为一个最小的例子,给出以下列表:

>>> flat = ["Shoes", "pants", "shirt", "tie", "jacket", "hat"]
Run Code Online (Sandbox Code Playgroud)

我可能想按长度分组,例如:

>>> nest_by_length(flat)
[['tie', 'hat'], ['shoes', 'pants', 'shirt'], ['jacket']]
Run Code Online (Sandbox Code Playgroud)

我见过几个类似的 问题建议.但是,在所有这些情况下,嵌套都基于输入列表的顺序.在我的例子中,输入列表的排序是完全不可预测的,输出的子列表的数量和每个子列表的项目数量也是如此.

是否有标准功能或惯用方法来实现这一目标?

python list

12
推荐指数
1
解决办法
333
查看次数

NumPy中的元素矩阵乘法

我正在进行Python和NumPy的第一次真正的尝试,以进行一些图像处理.我将图像加载为3维NumPy数组,其中轴0表示图像带,而轴1和2表示像素的列和行.由此,我需要采用代表每个像素的3x1矩阵并执行一些操作,从而产生另一个3x1矩阵,这将用于构建结果图像.

我的第一种方法(简化和随机数据)如下所示:

import numpy as np
import random

factor = np.random.rand(3,3)
input = np.random.rand(3,100,100)
results = np.zeros((3,100,100))

for x in range(100):
    for y in range(100):
        results[:,x,y] = np.dot(factor,input[:,x,y])
Run Code Online (Sandbox Code Playgroud)

但这让我感到不雅和低效.有没有办法在元素方面做到这一点,例如:

results = np.dot(factor,input,ElementWiseOnAxis0)
Run Code Online (Sandbox Code Playgroud)

在试图找到这个问题的解决方案时,我遇到了这个问题,这显然非常相似.但是,提交人无法解决问题令他们满意.我希望自2012年以来某些事情发生了变化,或者我的问题与他们的问题有很大的不同,使其更容易解决.

python arrays numpy image-processing matrix-multiplication

7
推荐指数
1
解决办法
1万
查看次数

Python中的Tarfile:我可以通过仅提取一些数据来更有效地解压吗?

我正在订购美国地质勘探局的大堆土地场景,这些场景来自tar.gz档案.我正在编写一个简单的python脚本来解压缩它们.每个存档包含15个60-120 mb大小的tiff图像,总计超过2 gb.我可以使用以下代码轻松提取整个存档:

import tarfile
fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
tfile.extractall("newfolder/")
Run Code Online (Sandbox Code Playgroud)

我实际上只需要15个tiff中的6个,在标题中标识为"乐队".这些是一些较大的文件,因此它们共同占据了大约一半的数据.所以,我认为我可以通过修改代码来加快这个过程,如下所示:

fileName = "LT50250232011160-SC20140922132408.tar.gz"
tfile = tarfile.open(fileName, 'r:gz')
membersList = tfile.getmembers()
namesList = tfile.getnames()
bandsList = [x for x, y in zip(membersList, namesList) if "band" in y]
print("extracting...")
tfile.extractall("newfolder/",members=bandsList)
Run Code Online (Sandbox Code Playgroud)

但是,为两个脚本添加一个计时器显示第二个脚本没有显着的效率增益(在我的系统上,两个脚本在一个场景上运行大约一分钟).虽然提取速度稍微快一点,但似乎这个增益可以通过确定首先需要提取哪些文件所花费的时间来抵消.

问题是,这种权衡取决于我正在做的事情,还是仅仅是我的代码效率低下的结果?我是python的新手,今天才发现tarfile,所以如果后者是真的我也不会感到惊讶,但是我还没有找到任何有效提取存档的部分建议.

谢谢!

python performance tarfile

7
推荐指数
2
解决办法
5454
查看次数

joblib.Parallel 用于嵌套列表理解

我有一个嵌套列表理解,看起来像这样:

>>> nested = [[1, 2], [3, 4, 5]]
>>> [[sqrt(i) for i in j] for j in nested]
[[1.0, 1.4142135623730951], [1.7320508075688772, 2.0, 2.23606797749979]]
Run Code Online (Sandbox Code Playgroud)

是否可以使用标准 joblib 方法将其并行化以实现令人尴尬的并行 for 循环?如果是这样,正确的语法是什么delayed

据我所知,文档没有提及或给出任何嵌套输入的示例。我尝试了一些简单的实现,但没有成功:

>>> #this syntax fails:
>>> Parallel(n_jobs = 2) (delayed(sqrt)(i for i in j) for j in nested)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\joblib\parallel.py", line 660, in __call__
    self.retrieve()
  File "C:\Python27\lib\site-packages\joblib\parallel.py", line 512, in retrieve
    self._output.append(job.get())
  File "C:\Python27\lib\multiprocessing\pool.py", line 558, …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing syntax list-comprehension joblib

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

在group_by中使用列索引而不是名称

我想用dplyr总结一个数据帧,如下所示:

> test <-data.frame(ID = c("A", "A", "B", "B"), val = c(1:4))
> test %>% group_by(ID) %>% summarize(av = mean(val))
# A tibble: 2 x 2
      ID    av
  <fctr> <dbl>
1      A   1.5
2      B   3.5
Run Code Online (Sandbox Code Playgroud)

但是假设不是按名称"ID"列进行分组,而是按第一列分组,而不管其名称如何.有一个简单的方法吗?

我已经尝试了一些幼稚的方法(group_by(1),group_by(.[1]),group_by(., .[1]),group_by(names(.)[1])无济于事.我才刚刚开始使用tidyverse包,所以我可能会丢失一些东西明显.

这个问题非常相似,但它是关于变异的,我无法将其概括为我的问题.这个问题也类似,但接受的答案是使用不同的包,我试图坚持使用dplyr.

r dplyr

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

无法在Linux Mint 17上安装R软件包

在Linux Mint 17上运行R 3.1.2,non-zero exit status当我尝试安装流行的软件包时,我得到了一个.示例install.packages尝试的完整输出如下:

> install.packages("plyr")
Installing package into ‘/home/joe_kendrick/R/x86_64-pc-linux-gnu-library/3.1’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/src/contrib/plyr_1.8.1.tar.gz'
Content type 'application/x-gzip' length 393233 bytes (384 Kb)
opened URL
==================================================
downloaded 384 Kb

* installing *source* package ‘plyr’ ...
** package ‘plyr’ successfully unpacked and MD5 sums checked
** libs
g++ -I/usr/share/R/include -DNDEBUG   -I"/usr/lib/R/site-library/Rcpp/include"   -fpic  -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -g  -c RcppExports.cpp -o RcppExports.o
/bin/bash: g++: command not found
make: *** [RcppExports.o] Error …
Run Code Online (Sandbox Code Playgroud)

linux r linux-mint

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

当 len &lt; ndim 时,使用元组(或列表)对 numpy 数组进行索引?

我有一个 3d numpy 数组,例如:

>>> A = np.arange(24).reshape(2,3,4)
Run Code Online (Sandbox Code Playgroud)

我想根据轴 1 和轴 2 的一对坐标沿轴 0 获取一维切片:

>>> h = 1
>>> l = 2
>>> A[:,h,l]
array([ 6, 18])
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都很好。但是,如果我的坐标对存储为元组或列表,而不是两个整数,该怎么办?我尝试了一些明显的选择,但无济于事:

>>> coords = (1,2)
>>> A[coords]
array([20, 21, 22, 23])
>>> A[:,coords]
array([[[ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])
>>> A[...,coords]
array([[[ 1,  2],
        [ 5,  6],
        [ 9, 10]],

       [[13, 14],
        [17, 18],
        [21, 22]]])
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索了一下,但没有找到任何东西,但完全有可能我没有使用适当的术语进行搜索。所以,如果这是一个过于简单的问题,我们深表歉意!

python arrays indexing numpy

3
推荐指数
1
解决办法
1123
查看次数

np.array ndmin 参数:指定添加维度的位置

我有一个 M 维np.ndarray,其中M <= N. 除了这个条件之外,阵列可以具有任何形状。我想将此数组转换为 N 维,其中维度 0 到 M 保持不变,维度 M 到 N 设置为 1。

我几乎可以通过使用参数复制数组np.array并提供参数来完成此行为ndmin。然而,这会将额外的轴放置在“第一个”位置而不是“最后一个”位置:

>>> a3d = np.zeros((2,3,4))
>>> a5d = np.array(a3d, ndmin = 5)
>>> a5d.shape
(1, 1, 2, 3, 4) #actual shape
(2, 3, 4, 1, 1) #desired shape
Run Code Online (Sandbox Code Playgroud)

有没有办法指定添加的维度应该放在哪里?我可以在这里使用替代函数来产生我想要的输出吗?

显然,在上面的示例中,我可以在事后操作数组,以按照我想要的顺序放置轴,但由于原始数组可能具有 0 到 5 维的任何位置(并且我希望将原始维度保持在原始顺序) ,如果不对原始形状进行一系列繁琐的检查,我想不出一种方法可以做到这一点。

python arrays numpy

2
推荐指数
1
解决办法
5485
查看次数

SciPy:使用b向量数组的元素方式非负最小二乘

我需要解决线性问题Ax = b,x使用最小二乘法获得.所有元素x必须是非负的,所以我使用scipy.optimize.nnls(文档在这里).

麻烦的是,我需要用单个A矩阵和许多b向量多次解决这个问题.我有一个3d numpy ndarray,其中沿轴0b矢量是矢量,而其他两个轴对应于空间中的点.我希望将所有x向量输出到相应的数组,以便保留每个答案的空间信息.

问题的第一个传递看起来像这样:

A = np.random.rand(5,3)
b_array = B = np.random.rand(5,100,100)
x_array = np.zeros((3,100,100))

for i in range(100):
    for j in range(100):
        x_array[:,i,j] = sp.optimize.nnls(A, b_array[:,i,j])[0]
Run Code Online (Sandbox Code Playgroud)

这段代码非常实用,但感觉完全不优雅.更重要的是,它可能会非常慢(我的实际代码使用非常大的数据集,并且通过随机参数更改循环数千次,因此效率很重要).

不久之后,我问了一个关于元素矩阵乘法的非常相似的问题.我被介绍过np.einsum,在许多情况下证明它非常有用.我原本希望最小二乘解决方案有类似的功能,但一直找不到任何东西.如果有人知道可能有效的功能,或者有效/热情地解决这个问题的替代方法,那将非常感激!

python arrays numpy scipy least-squares

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