小编Mik*_*ler的帖子

在Python中单独处理相同类型的异常

说我有以下四个变量:

>>> f1 = (print, 1, 2 ,3 ,4)
>>> f2 = (exit, 1, 2 ,3 ,4)
>>> f3 = (1, 2, 3, 4)
>>> f4 = 4
Run Code Online (Sandbox Code Playgroud)

在一个假设的程序中,我希望每个变量都包含一个元组,其第一个项应该是函数的名称,其后续项应该按顺序表示函数的参数.

我可以像这样调用以这种方式存储的函数:

>>> f1[0](*f1[1:])
1 2 3 4
Run Code Online (Sandbox Code Playgroud)

但是,大多数这些变量都不是例外格式,我希望能够封装它们在try/ exceptblocks中的调用,以便处理这些情况.

现在,即使函数调用了f2,f3并且f4由于完全不同的原因而中断,它们都会抛出同样的异常,a TypeError:

>>> f2[0](*f2[1:])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __call__() takes from 1 to 2 positional arguments but 5 were given
>>> f3[0](*f3[1:])
Traceback (most …
Run Code Online (Sandbox Code Playgroud)

python exception

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

将一个Pandas Dataframe划分为另一个 - 忽略索引但尊重列

我有2个数据帧.我想广播分道操作

df1= pd.DataFrame([[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]],
                  columns=['A','B','C','D'], index=['x','y','z'])

df2= pd.DataFrame([[0.,1.,2.,3.]], columns=['A','B','D','C'], index=['q'])
Run Code Online (Sandbox Code Playgroud)

请注意,df2中的列的对齐方式略有不同.

我想将df1除以df2,其中广播行但是列标签被尊重.

   A   B   C   D
x  1   2   3   4
y  5   6   7   8
z  9  10  11  12


   A  B  D  C
q  0  1  2  3
Run Code Online (Sandbox Code Playgroud)

这是错误的.

df1.values/df2.values

[[         inf   2.           1.5          1.33333333]
 [         inf   6.           3.5          2.66666667]
 [         inf  10.           5.5          4.        ]]
Run Code Online (Sandbox Code Playgroud)

答案我的愿望是:

   A    B   C      D
x  inf  2   1      2
y  inf  6   2.33   4
z  inf  10  3.66   6
Run Code Online (Sandbox Code Playgroud)

python divide pandas

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

Python:str.split() - 是否可以只指定"limit"参数?

我想在空格上拆分一个字符串(默认行为),但我希望它只拆分一次 - 也就是说我希望它返回一个最多包含2个项目的数组.

如果不可能 - 即如果为了指定限制我还必须指定模式 - 你能告诉我们如何指定默认模式吗?

python string

5
推荐指数
3
解决办法
6832
查看次数

IPython autoreload为重复调用Python2 super()提供错误

我正在一个IPython笔记本中的原型,它从我的计算机上的模块加载Python2代码.我激活了重新加载魔术命令,以便在我进行代码更改并重新运行单元格以查看其影响时,更容易在文本编辑器和笔记本之间来回切换:

%reload_ext autoreload
%autoreload 2
Run Code Online (Sandbox Code Playgroud)

我在Python 2.7.10中工作,因为我使用了一些不能编译的遗留代码.我的部分工作是扩展这些遗留代码中的一些类并重载它们的一些方法.但是,我还需要调用一些原始的基本方法来完成重要的工作.例如:

class LegacyBase:

    def important_method(self):
        #old stuff i'll need

class NewClass(LegacyBase):

    #overload base method
    def important_method(self):
       #do some new stuff

       while 1:
           #call old method to do stuff
           super(NewClass, self).important_method() #use old Python2 super calls :(

           #some break conditions
Run Code Online (Sandbox Code Playgroud)

当我第一次在我的笔记本中调用important_method()某个NewClass实例时(意味着,在内核重置后),它运行正常.循环使得super呼叫不止一次发生!没有错误

但是,如果我去修改一些代码来我的新方法,在我的文本编辑器,并回到IPython的细胞并再次调用它,我得到以下错误在我的重载线路important_method(),其中super呼叫.

TypeError: super(type, obj): obj must be an instance or subtype of type
Run Code Online (Sandbox Code Playgroud)

注意:我尝试将新方法命名为另一个名称,因为我认为这与重载方法再次调用自身有关,但这没有帮助.此外,我希望它们是相同的名称,因为这是一个API方法,我希望遗留代码的用户能够调用他们之前知道的相同方法.

知道如何使用这些Python2 super调用在IPython笔记本中重新加载吗?

谢谢!

python super python-2.7 ipython-notebook

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

计算多列的平均值,忽略NaN pandas numpy

我有一个基本的价值表:

import pandas as pd
import numpy as np
test = pd.read_csv('mean_test.csv')
test.replace('n/a',np.nan)
test


value1  value2  value3
1   9   5
5   NaN 4
9   55  NaN
NaN 4   9
Run Code Online (Sandbox Code Playgroud)

我想计算三个值的平均值,忽略NaN,所以对于第二行,它将是(5 + 4)/ 2.因此我不能使用.replace函数在NaN的位置放置零.我已经搜索了其他一些问题,但找不到任何涵盖此问题的内容.我错过了一些明显的东西吗

python pandas

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

价值差异的功能

Python中是否有一个函数来获取列表中两个或多个值之间的差异?那么,在这两个列表中:

list1 = [1, 5, 3, 7]
list2 = [4, 2, 6, 4]
Run Code Online (Sandbox Code Playgroud)

我需要计算list1和list2中每个值之间的差异.

for i in list1:
    for ii in list2:
       print i -ii
Run Code Online (Sandbox Code Playgroud)

这给出了负值,但我希望两个列表的值之间的减法仅从最高值到最低值,以便不获得负值.

对于上面的列表,我希望输出为[3, 3, 3, 3].

谢谢.

python list python-2.7 python-3.x

5
推荐指数
3
解决办法
149
查看次数

定义多个相同类型对象的内存效率更高的方法

所以,我正在涉足等离子体模拟的世界。现在,虽然我知道顶级模拟是用 Fortran 编写的,并且具有超内存效率的子例程和专用代码,但我希望只运行一些低级模拟。

我的问题是,在时变环境(好吧,时间步进)中模拟大量粒子时,跟踪所有数据是一个技巧。我之前使用过多维数组——使用粒子的列号和属性的行号,但是这感觉很笨拙。然而,它似乎执行得更快。

我最近尝试定义我自己的类,但是作为一个 Python 新手,我可能以一种非常低效的方式做到了。对于 3 维中的每个粒子,我需要能够存储粒子的位置、速度和力(一旦代码变得更复杂,就有可能添加更多变量)。使用我对类的了解,我定义了一个particle对象(我认为),它使我的代码更易于阅读和遵循:

# Define Particle as a class
class particle():
    def __init__(self, index=0, pos=np.array([0, 0, 0]), vel=np.array([0,0,0]), 
                 F=np.array([0, 0, 0])):
        self.index = index      # Particle index (identifier)
        self.pos = pos          # Position 3-vector
        self.vel = vel          # Velocity 3-vector
        self.F = F              # Net force 3-vector (at particle)
Run Code Online (Sandbox Code Playgroud)

因此,我可以轻松地初始化包含大量这些对象的数组,并以相当简单的方式修改每个值。然而,正如我所提到的,这对于仅涉及少数粒子的模拟运行速度较慢。我将使用我的代码将其与纯粹面向矩阵的方法进行比较,以查看哪种方法在大型模拟中的扩展性更好。

我想我的问题是:以这种方式定义“粒子”是最有效的吗?或者是否有更高效的 CPU/内存方式来定义这样的对象。我想保留它的方法能力(即particle[i].pos = [1,2,3]particle[2].vx[1] = 3),以便我可以为每个粒子设置值,并将它们传递给函数。请记住,我是 Python 新手,所以我可能不会在大型复杂代码上取得巨大成功。

python arrays simulation types class

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

通过列索引而不是列名来调用数据框中的列-Pandas

如何使用数据框中的索引而不是其名称在代码中调用列。

例如,我有数据帧df的列abc

除了调用之外df['a'],我可以使用其列索引来调用它df[1]吗?

python dataframe pandas

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

如何将项目附加到 Pandas 中不同列的列表

我有一个看起来像这样的数据框:

dic = {'A':['PINCO','PALLO','CAPPO','ALLOP'],
       'B':['KILO','KULO','FIGA','GAGO'],
       'C':[['CAL','GOL','TOA','PIA','STO'],
            ['LOL','DAL','ERS','BUS','TIS'],
            ['PIS','IPS','ZSP','YAS','TUS'],
            []]}
df1 = pd.DataFrame(dic)
Run Code Online (Sandbox Code Playgroud)

我的目标是为每一行插入元素 A作为 column 中包含的列表的第一项C。同时,我想将 的元素设置B为包含在C.

我能够通过使用以下代码行来实现我的目标:

for index, row in df1.iterrows():
    try:
        row['C'].insert(0,row['A'])
        row['C'].append(row['B'])
    except:
        pass
Run Code Online (Sandbox Code Playgroud)

有没有更优雅、更有效的方法来实现我的目标,也许使用一些 Pandas 函数?我想避免 for 循环。

python list append dataframe pandas

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

python animation.FuncAnimation 错误:对象不可迭代

我是 Python 新手,现在正在学习matplotlib使用动画功能。我在下面的qutip,因为我的学习教程。但是当我复制并粘贴qutip教程的示例代码时,它不起作用错误消息是 Axes3D object is not iterable.
所以,我想检查我创建的代码,但不知道问题是否是我的代码是另一回事。我不知道该怎么做,想知道为什么示例代码不起作用。

这是教程中的示例代码:

from qutip import *
from scipy import *
def qubit_integrate(w, theta, gamma1, gamma2, psi0, tlist):

    sx = sigmax(); sy = sigmay(); sz = sigmaz(); sm = sigmam()
    H = w * (cos(theta) * sz + sin(theta) * sx)
    c_op_list = []
    n_th = 0.5 # temperature
    rate = gamma1 * (n_th + 1)
    if rate > 0.0: c_op_list.append(sqrt(rate) * sm)
    rate = gamma1 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-2.7 qutip

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