我想弄清楚何时在pandas DataFrame中使用不同的选择方法.特别是,我正在寻找访问标量值.我经常听到ix一般的推荐.但在pandas文档中
,建议使用at和iat快速标量值访问:
Since indexing with [] must handle a lot of cases (single-label access, slicing, boolean indexing, etc.), it has a bit of overhead in order to figure out what you’re asking for. If you only want to access a scalar value, the fastest way is to use the在and iat methods, which are implemented on all of the data structures.
因此,我认为iat应该更快地获取和设置单个单元格.然而,经过一些测试,我们发现ix读取细胞的速度相当或更快,而iat为细胞分配值要快得多.
这种行为记录在哪里吗?它总是如此,为什么会发生这种情况?是否必须对返回视图或复制执行某些操作?如果有人能对这个问题有所了解并解释建议获取和设置单元格值以及原因,我将不胜感激.
以下是使用pandas的一些测试(版本0.15.2).
为了确保此行为不是此版本的错误,我还在0.11.0上测试了它.我没有提供结果,但趋势完全相同 …
我正在使用--windowed标志为PyOSaller打包一个用于MacOS的GUI应用程序.是否可以将其打包,以便除GUI之外还显示控制台?当我尝试设置console = True时,GUI部分失败.
换句话说,当我通过键入"打开My.App/Contents/MacOS/myapp"从终端启动应用程序时,我确实得到了GUI和控制台.我想通过双击应用程序而不启动终端来获得类似的行为.有办法吗?
考虑一个维数NxM的numpy数组A. 目标是计算欧几里德距离矩阵D,其中每个元素D [i,j]是行i和j之间的核心距离.这样做的最快方法是什么?这不是我需要解决的问题,但它是我正在尝试做的一个很好的例子(通常,可以使用其他距离度量).
这是迄今为止我能想到的最快的:
n = A.shape[0]
D = np.empty((n,n))
for i in range(n):
D[i] = np.sqrt(np.square(A-A[i]).sum(1))
Run Code Online (Sandbox Code Playgroud)
但这是最快的方式吗?我主要关注for循环.我们可以用Cython打败这个吗?
为了避免循环,我尝试使用广播,并执行以下操作:
D = np.sqrt(np.square(A[np.newaxis,:,:]-A[:,np.newaxis,:]).sum(2))
Run Code Online (Sandbox Code Playgroud)
但事实证明这是一个坏主意,因为构建维度NxNxM的中间3D阵列会产生一些开销,因此性能更差.
我试过Cython.但我是Cython的新手,所以我不知道我的尝试有多好:
def dist(np.ndarray[np.int32_t, ndim=2] A):
cdef int n = A.shape[0]
cdef np.ndarray[np.float64_t, ndim=2] dm = np.empty((n,n), dtype=np.float64)
cdef int i = 0
for i in range(n):
dm[i] = np.sqrt(np.square(A-A[i]).sum(1)).astype(np.float64)
return dm
Run Code Online (Sandbox Code Playgroud)
上面的代码比Python的for循环慢一点.我对Cython知之甚少,但我认为我可以达到至少与for loop + numpy相同的性能.我想知道在正确的方式下是否有可能实现一些显着的性能提升?或者是否还有其他方法可以加快速度(不涉及并行计算)?
当模块不在我的 Python 路径中时,如何在模块内运行脚本?
考虑一些假想的包:
package/
__init__.py
main.py
helper/
__init__.py
script.py
other/
__init__.py
anotherscript.py
Run Code Online (Sandbox Code Playgroud)
说我们想跑script.py。当包在我的 Python 路径中时,这会完成这项工作:
python -m package.helper.script
Run Code Online (Sandbox Code Playgroud)
但如果不是这样呢?有没有办法告诉python模块的位置?就像是
python -m /path_to_my_package/package.helper.script
Run Code Online (Sandbox Code Playgroud)
(显然,以上不起作用)
编辑:
(1) 我正在寻找不涉及环境变量的解决方案。
(2)script.py包含相对导入,所以全路径script.py并不能解决问题。
如何在Python中有效地将32位整数转换为四个8位整数的数组?
目前我有以下代码,这是超慢:
def convert(int32_val):
bin = np.binary_repr(int32_val, width = 32)
int8_arr = [int(bin[0:8],2), int(bin[8:16],2),
int(bin[16:24],2), int(bin[24:32],2)]
return int8_arr
Run Code Online (Sandbox Code Playgroud)
例如:
print convert(1)
>>> [0, 0, 0, 1]
print convert(-1)
>>> [255, 255, 255, 255]
print convert(-1306918380)
>>> [178, 26, 2, 20]
Run Code Online (Sandbox Code Playgroud)
我需要在无符号32位整数上实现相同的行为.
另外.是否可以将其矢量化为32位整数的大型numpy数组?
考虑输入字符串:
mystr = "just some stupid string to illustrate my question"
Run Code Online (Sandbox Code Playgroud)
以及指示输入字符串拆分位置的字符串列表:
splitters = ["some", "illustrate"]
Run Code Online (Sandbox Code Playgroud)
输出应该是这样的
result = ["just ", "some stupid string to ", "illustrate my question"]
Run Code Online (Sandbox Code Playgroud)
我写了一些代码来实现以下方法.对于每个字符串splitters,我在输入字符串中找到它的出现,并插入一些我知道肯定不会是我输入字符串的部分(例如,这个'!!').然后我使用刚刚插入的子字符串拆分字符串.
for s in splitters:
mystr = re.sub(r'(%s)'%s,r'!!\1', mystr)
result = re.split('!!', mystr)
Run Code Online (Sandbox Code Playgroud)
这个解决方案看起来很难看,有没有更好的方法呢?
我正在学习Perl,并且在从命令行运行程序与在调试器中交互式地执行它之间存在一些不一致.
具体来说,我调用Perl调试器perl -d -e 1,并逐行运行此代码
my $a = 1;
print $a;
$b = 2;
print $b;
Run Code Online (Sandbox Code Playgroud)
在输出中我只看到了值$b,而$a似乎是未定义的.同时,当我执行相同的语句时perl myscript.pl,两个值都显示在输出中.为什么会这样?我错过了什么?
python ×6
numpy ×2
cython ×1
indexing ×1
macos ×1
optimization ×1
package ×1
pandas ×1
performance ×1
perl ×1
pyinstaller ×1
regex ×1
split ×1