我有一个字典,并希望将其中的一部分传递给一个函数,该部分由一个列表(或元组)给出.像这样:
# the dictionary
d = {1:2, 3:4, 5:6, 7:8}
# the subset of keys I'm interested in
l = (1,5)
Run Code Online (Sandbox Code Playgroud)
现在,理想情况下我希望能够做到这一点:
>>> d[l]
{1:2, 5:6}
Run Code Online (Sandbox Code Playgroud)
...但这不起作用,因为它会寻找一个名为的钥匙(1,5).并且d[1,5]甚至不是有效的Python(虽然看起来它会很方便).
我知道我可以这样做:
>>> dict([(key, value) for key,value in d.iteritems() if key in l])
{1: 2, 5: 6}
Run Code Online (Sandbox Code Playgroud)
或这个:
>>> dict([(key, d[key]) for key in l])
Run Code Online (Sandbox Code Playgroud)
这更紧凑...但我觉得必须有一个"更好"的方式来做到这一点.我错过了更优雅的解决方案吗?
(我使用的是Python 2.7)
我有一个np.array data形状(28,8,20),我只需要它的某些条目,所以我正在切片:
In [41]: index = np.array([ 5, 6, 7, 8, 9, 10, 11, 17, 18, 19])
In [42]: extract = data[:,:,index]
In [43]: extract.shape
Out[43]: (28, 8, 10)
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,一切都应该如此.但是现在我只想看看第一行最后一个索引的前两个条目:
In [45]: extract[0,:,np.array([0,1])].shape
Out[45]: (2, 8)
Run Code Online (Sandbox Code Playgroud)
等等,应该是(8,2).它改变了指数,即使我最后一次切片时没有!根据我的理解,以下应采取相同的行动:
In [46]: extract[0,:,:2].shape
Out[46]: (8, 2)
Run Code Online (Sandbox Code Playgroud)
......但它给了我我想要的东西!但是,只要我有一个3D数组,这两种方法似乎都是等价的:
In [47]: extract[:,:,np.array([0,1])].shape
Out[47]: (28, 8, 2)
In [48]: extract[:,:,:2].shape
Out[48]: (28, 8, 2)
Run Code Online (Sandbox Code Playgroud)
那么,如果我不仅需要前两个条目而且需要不规则列表,我该怎么办?我当然可以在操作后转置矩阵,但这看起来非常违反直觉.我的问题的一个更好的解决方案是这个(虽然可能有一个更优雅的):
In [64]: extract[0][:,[0,1]].shape
Out[64]: (8, 2)
Run Code Online (Sandbox Code Playgroud)
这把我们带到了实际
我想知道这种行为的原因是什么?无论谁决定它应该如何工作,可能比我更了解编程,并认为这在某种程度上是一致的,我完全没有.除非我有办法理解它,否则我可能会继续关注这个问题.
我有一个Python脚本,我想执行它到某一点,然后停止,并保持解释器打开,所以我可以看到它定义的变量,等等.
我知道我可以生成异常,或者我可以通过运行来调用调试器pdb.set_trace(),然后停止调试器,这是我目前使用的.
...但是有一个命令只会停止脚本,好像它已经完全结束了吗?这相当于注释脚本的其余部分(但我不喜欢这样做),或者return在函数中添加早期语句.
似乎这样的东西必须存在,但到目前为止我还没有找到它.
编辑:我的用例的更多细节
我通常在Spyder中使用常规Python控制台.IPython似乎是一件好事,但(至少对于我目前使用的版本,2.2.5)一些普通的控制台功能在IPython(内省,自动完成)中不能很好地工作.通常,我的代码生成matplotlib数字.在调试模式下,那些无法更新(据我所知),这就是为什么我需要完全脱离脚本,而不是解释器).调试器的另一个限制是我无法在其中执行循环:您可以将循环的代码复制/粘贴到常规控制台并让它执行,但这在调试器中不起作用(至少在我的Spyder中)版).
我已经使用 numpy 一段时间了,并且很喜欢它对向量和矩阵的简单操作比循环同一数组的元素要快得多。
我的理解是它使用 SIMD CPU 扩展,但根据一些人的说法,至少它的一些功能是利用多处理(通过 openMP?)。另一方面,关于通过使用多处理来加速 numpy 数组的操作(示例),这里有很多问题。
我还没有看到 numpy 确实同时使用多个核心,尽管看起来有时有两个核心(在 8 核机器上)正在使用。但我可能为此使用了“错误”的函数,或者以错误的方式使用它们,或者我的矩阵太小而不值得?
因此问题是:
是否有一些 numpy 函数可以通过 openMP 或其他方式在共享内存机器上使用多个进程?
如果是,numpy 文档中是否有某个地方包含这些函数的明确列表?
在这种情况下,是否有一些文档说明 numpy 用户必须执行哪些操作才能确保他们使用所有可用的 CPU 核心或某些特定的预定数量的核心?
我知道有些库允许在多台机器或计算节点上拆分 numpy 数组等,但我怀疑其用例要么能够处理比本地 RAM 容纳的更多的数据,要么加快处理速度超过单个多核机器所能实现的。然而,这不是这个问题的目的。
更新
鉴于 @talonmies 的评论(他指出默认情况下 numpy 中没有这样的功能,并且它将依赖于 LAPACK 和 BLAS):What's the best way to get apropesly-compiled numpy version that make use of multiple CPU cores (and希望还有 SIMD 扩展)?
或者是为什么 numpy 通常不进行多处理,大多数对这很重要的人已经转而使用多处理或dask之类的东西来显式处理多个核心,而不是仅隐式加速 numpy 位?
我正在为相当大的数据集创建径向基函数插值模型。主要调用 `scipy.interpolate.Rbf(,) 大约需要一分钟和 14 GB 的 RAM。由于并非每台应该运行的机器都能够执行此操作,并且由于该程序将经常在同一数据集上运行,因此我想将结果腌制到文件中。这是一个简化的例子:
import scipy.interpolate as inter
import numpy as np
import cPickle
x = np.array([[1,2,3],[3,4,5],[7,8,9],[1,5,9]])
y = np.array([1,2,3,4])
rbfi = inter.Rbf(x[:,0], x[:,1], x[:,2], y)
RBFfile = open('picklefile','wb')
RBFpickler = cPickle.Pickler(RBFfile,protocol=2)
RBFpickler.dump(rbfi)
RBFfile.close()
Run Code Online (Sandbox Code Playgroud)
该RBFpickler.dump()调用导致can't pickle <type 'instancemethod'>错误。据我了解,这意味着那里有一个方法(好吧,rbfi()是可调用的),并且由于某种我不太明白的原因不能腌制。
有谁知道以其他方式腌制或以其他方式保存inter.Rbf()调用结果的方法?
有一些形状为 (nd,n) 和 (n,n) 的数组 ( rbfi.A, rbfi.xi, rbfi.di...) ,我假设它们存储了所有有趣的信息。我想我可以只腌制那些数组,但是我不确定如何再次将对象放在一起......
编辑: 附加约束:我不允许在系统上安装附加库。我可以包含它们的唯一方法是它们是否是纯 Python 并且我可以将它们包含在脚本中而无需编译任何东西。
Meld 曾经在我的机器上工作(openSuse Linux 13.1,Python 2.7.6),但是在使用 Spyder 出现问题后(就像它拒绝实际运行任何脚本一样),我卸载了大量的东西,然后又慢慢地把它们带回来。
从那以后,meld 不再起作用。我不断收到此错误消息
> meld
Cannot import: GTK+
No module named gi
Run Code Online (Sandbox Code Playgroud)
我能够通过安装 gi 来解决这个问题:
> pip install gi
Run Code Online (Sandbox Code Playgroud)
现在错误被替换为:
> meld
Cannot import: GTK+
No module named repository
Run Code Online (Sandbox Code Playgroud)
...这是一个类似的问题,卸载gi显然有帮助?我糊涂了。我确实尝试再次卸载它,但这让我回到了之前的错误(废话!)。
有任何想法吗?
我有一个 Numpy 数组和一个索引列表,以及一个包含需要进入这些索引的值的数组。
我知道如何实现这一目标的最快方法是:
In [1]: a1 = np.array([1,2,3,4,5,6,7])
In [2]: x = np.array([10,11,12])
In [3]: ind = np.array([2,4,5])
In [4]: a2 = np.copy(a1)
In [5]: a2.put(ind,x)
In [6]: a2
Out[6]: array([ 1, 2, 10, 4, 11, 12, 7])
Run Code Online (Sandbox Code Playgroud)
请注意,我必须复制a1. 我使用它的目的是包装一个将数组作为输入的函数,因此我可以将其提供给优化器,该优化器将改变其中一些元素。
因此,理想情况下,我希望在一行中返回原始文件的修改副本,其工作方式如下:
a2 = np.replace(a1, ind, x)
Run Code Online (Sandbox Code Playgroud)
原因是我需要像这样应用它:
def somefunction(a):
....
costfun = lambda x: somefunction(np.replace(a1, ind, x))
Run Code Online (Sandbox Code Playgroud)
随着a1与ind不变,这将然后给我一个costfunction这是只有x的函数。
我目前的后备解决方案是自己定义一个小函数:
def replace(a1, ind, x):
a2 = np.copy(a1)
a2.put(ind,x)
return(a2)
Run Code Online (Sandbox Code Playgroud)
...但这对我来说似乎不是很优雅。
=> 有没有办法把它变成一个 …
我有许多包含复数的二维np.arrays(都是相同大小).它们中的每一个都属于4维空间中的一个位置.那些位置稀疏且不规则地分布(确切地说是拉丁超立方体).我想将这些数据插入到同一个4维空间中的其他点.
我能成功地做到了简单的数字,即使用sklearn.kriging(),scipy.interpolate.Rbf()(或其他):
# arrayof co-ordinates: 2 4D sets
X = np.array([[1.0, 0.0, 0.0, 0.0],\
[0.0, 1.0, 0.0, 0.0]])
# two numbers, one for each of the points above
Y = np.array([1,\
0])
# define the type of gaussian process I want
kriging = gp.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=4.0,\
corr='linear', normalize=True, nugget=0.00001, optimizer='fmin_cobyla')
# train the model on the data
kmodel = kriging.fit(X,Y)
# interpolate
kmodel.predict(np.array([0.5, 0.5, 0.0, 0.0]))
# returns: array([ 0.5])
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用数组(或只是复数)作为数据,这不起作用:
# two arrays of complex …Run Code Online (Sandbox Code Playgroud)