小编ger*_*rit的帖子

Numpy快速检查完全数组相等,就像Matlabs isequal

在Matlab中,内置isequal函数检查两个数组是否相等.如果它们不相等,这可能会非常快,因为一旦存在差异,实施可能会停止检查:

>> A = zeros(1e9, 1, 'single');    
>> B = A(:);                     
>> B(1) = 1;
>> tic; isequal(A, B); toc;
Elapsed time is 0.000043 seconds.
Run Code Online (Sandbox Code Playgroud)

Python/numpy中是否有任何等价? all(A==B)或者all(equal(A, B))速度慢得多,因为它比较了所有元素,即使最初的元素不同:

In [13]: A = zeros(1e9, dtype='float32')                                                                                                                                                           

In [14]: B = A.copy()

In [15]: B[0] = 1

In [16]: %timeit all(A==B)
1 loops, best of 3: 612 ms per loop
Run Code Online (Sandbox Code Playgroud)

是否有任何numpy等价物?这应该是很容易用C实现,但在Python实现,因为这是我们做的情况下缓慢并不想进行广播,所以它需要一个明确的循环.

编辑:

它看起来array_equal像我想要的.但是,它并不比它快all(A==B),因为它不是内置的,而只是一个简短的Python函数A==B.所以它不符合我快速检查的需要.

In …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

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

通过继承`io.TextIOWrapper`对子文件进行子类化 - 但它的构造函数有哪些签名?

我试图子类io.TextIOWrapper下面这篇文章,虽然我的目标是不同的.从这开始(NB:动机):

class MyTextIOFile(io.TextIOWrapper):
    def read(self, *args):
        cont = super().read(*args)
        return cont.replace("\x00", "")
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用我的构造函数打开文件

In [81]: f = MyTextIOFile("file.csv")
Run Code Online (Sandbox Code Playgroud)

但这给了:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-90-343e18b2e32f> in <module>()
----> 1 f = MyTextIOFile("file.csv")

AttributeError: 'str' object has no attribute 'readable'
Run Code Online (Sandbox Code Playgroud)

事实上,似乎io.TextIOWrapper构造函数希望传递一个文件对象.通过反复试验,我发现这个文件对象需要以二进制模式打开.但是我无法在任何地方找到文档,而且我不想构建在无证件行为之上(实际上,尝试继续使用它已经导致我在尝试传递对象时遇到问题csv.reader).在Python 3中对文件对象进行子类化的正确和受支持的方法是什么?

我正在使用Python 3.5.0.

python io subclassing python-3.x

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

处理不受setrlimit限制的资源

我写了一个简单的程序来限制它的数据大小为65Kb,并验证相同我分配一个超过65Kb的虚拟内存,逻辑上如果我正在做所有正确(如下)malloc调用应该失败,不是吗?

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main (int argc, char *argv[])
{
  struct rlimit limit;


  /* Get max data size . */
  if (getrlimit(RLIMIT_DATA, &limit) != 0) {
    printf("getrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  printf("The soft limit is %lu\n", limit.rlim_cur);
  printf("The hard limit is %lu\n", limit.rlim_max);

  limit.rlim_cur = 65 * 1024;
  limit.rlim_max = 65 * 1024;

  if (setrlimit(RLIMIT_DATA, &limit) != 0) {
    printf("setrlimit() failed with errno=%d\n", errno);
    return 1;
  }

  if (getrlimit(RLIMIT_DATA, &limit) != …
Run Code Online (Sandbox Code Playgroud)

c malloc memory-management ulimit setrlimit

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

如何使用`setr​​limit`来限制内存使用?RLIMIT_AS过早死亡; RLIMIT_DATA,RLIMIT_RSS,RLIMIT_STACK完全没有杀死

我试图setrlimit限制我在Linux系统上的内存使用,以阻止我的进程崩溃机器(我的代码崩溃了高性能集群上的节点,因为一个错误导致内存消耗超过100 GiB ).我似乎无法找到传递给他的正确资源setrlimit; 我认为它应该是常驻的,不能用setrlimit限制,但我对常驻,堆,堆栈感到困惑.在下面的代码中; 如果我只取消注释RLIMIT_AS,代码将失败MemoryError,numpy.ones(shape=(1000, 1000, 10), dtype="f8")即使该数组应该只有80 MB.如果我只取消注释RLIMIT_DATA,RLIMIT_RSSRLIMIT_STACK两个阵列获得成功分配,即使总内存使用量为2 GB,或两次所需的最大.

我想让我的程序一旦尝试分配太多RAM就失败(无论如何).为什么所有的RLIMIT_DATA,RLIMIT_RSS,RLIMIT_STACKRLIMIT_AS做什么,我的意思是,什么是正确的资源传递给setrlimit

$ cat mwe.py 
#!/usr/bin/env python3.5

import resource
import numpy

#rsrc = resource.RLIMIT_AS
#rsrc = resource.RLIMIT_DATA
#rsrc = resource.RLIMIT_RSS
#rsrc = resource.RLIMIT_STACK

soft, hard = resource.getrlimit(rsrc)
print("Limit starts as:", soft, hard)

resource.setrlimit(rsrc, (1e9, 1e9))

soft, hard = resource.getrlimit(rsrc)
print("Limit is now:", soft, …
Run Code Online (Sandbox Code Playgroud)

python memory numpy setrlimit

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

具有掩码数组的 xarray,同时保留整数数据类型

目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这xarray可能是一个很好的选择,但是当我尝试向它传递一个掩码数组时,它会将其数据类型更改为 float:

In [137]: x = arange(30, dtype="i1").reshape(3, 10)

In [138]: xr.Dataset({"count": (["x", "y"], ma.masked_where(x%5>3, x))}, coords={"x": range(3), "y":
     ...: range(10)})
Out[138]:
<xarray.Dataset>
Dimensions:  (x: 3, y: 10)
Coordinates:
  * y        (y) int64 0 1 2 3 4 5 6 7 8 9
  * x        (x) int64 0 1 2
Data variables:
    count    (x, y) float64 0.0 1.0 2.0 3.0 nan 5.0 6.0 7.0 8.0 nan 10.0 ...
Run Code Online (Sandbox Code Playgroud)

这对我来说是不可取的,因为(1)我的数据集的内存消耗将会爆炸(它已经很大),并且(2)我的许多整数数据类型都是位字段,不能表示为浮点数。尽管int32位域可以无损地表示为 a float64,但来回比较丑陋且容易出错。

是否可以xarray.Dataset …

python python-xarray masked-array

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

我如何使用importlib.LazyLoader?

在我的模块中,我有几个依赖于具有较长启动时间的外部模块的功能.我该怎么用LazyLoader?如果我有

import veggies
Run Code Online (Sandbox Code Playgroud)

要么

import veggies.brussels.sprouts
Run Code Online (Sandbox Code Playgroud)

要么

from veggies.brussels import sprouts
Run Code Online (Sandbox Code Playgroud)

如何替换这些语句以便LazyLoader模块内容的执行被推迟到需要时?

从文档中可以立即明白如何使用它.没有示例,并且nullege代码搜索仅提供Python本身包含的单元测试.

python python-module python-import python-importlib

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

在 Dask 中排序

我想在 dask 中找到pandas.dataframe.sort_value函数的替代方法。
我是通过set_index 来的,但它会按单列排序。

如何对 Dask 数据框的多列进行排序?

sorting dask dask-delayed dask-distributed

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

我何时可以传递函数句柄?

我有一个缓存评估功能.作为参数之一,它需要一个函数句柄.在某些情况下,函数句柄是不可访问的,我不太明白为什么.下面的例子显示了让我难过的原因:

>> A.a = @plus; feval(@A.a, 1, 1)

ans =

     2

>> clear A
>> A.a.a = @plus; feval(@A.a.a, 1, 1)
Error using feval
Undefined function 'A.a.a' for input arguments of type 'double'.
Run Code Online (Sandbox Code Playgroud)

因此,如果我将一个函数句柄存储为一个结构成员,如果它是一个深度,我可以传递它,但如果它是两个级别深,则不能.在我的实际使用情况下,我有一个结构D保存各种类别的许多(117)的情况下,所以其实我有stct.obj.meth,这里stct是一个结构,obj是一个类的实例/对象,meth是一种方法.传递@stct.obj.meth失败,但如果我分配A = stct.obj,则传递@A.meth成功.

在什么条件下我可以将函数句柄作为参数传递,以便它仍然可以在堆栈中访问?


编辑:虽然在上面的用例中,我可以简单地删除@因为@plus已经是一个函数句柄.但是,请考虑以下情况:

>> type cltest.m

classdef cltest < handle
    methods
        function C = mymeth(self, a, b)
            C = a + b;
        end
    end …
Run Code Online (Sandbox Code Playgroud)

matlab stack namespaces function-handle matlab-class

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

如何将 git lfs 与“普通”git 一起使用

我将普通(非 lfs)存储库克隆到本地驱动器。现在我想向其中添加一个大于 100MB 的文件并将更改提交到存储库。我为此使用了以下命令:

git clone ....
Run Code Online (Sandbox Code Playgroud)

然后,我复制要添加到存储库的大小 >100MB 的文件。假设该文件的名称是“文件名”。

git lfs init
git lfs track "filename"
git add "filename"
git commit -m "commit message"
git push -u origin
Run Code Online (Sandbox Code Playgroud)

此操作失败,并显示文件大小错误消息,指出仅允许最大 100MB 的文件大小。

那么在这种情况下我该如何使用 git lfs 呢?

git git-lfs

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

pandas 数据帧上的 s3fs gzip 压缩

我正在尝试使用s3fs库和 pandas在 S3 上将数据帧编写为 CSV 文件。尽管有文档,但恐怕 gzip 压缩参数不适用于 s3fs。

def DfTos3Csv (df,file):
    with fs.open(file,'wb') as f:
       df.to_csv(f, compression='gzip', index=False)
Run Code Online (Sandbox Code Playgroud)

此代码将数据帧保存为 S3 中的新对象,但保存为纯 CSV 而非 gzip 格式。另一方面,使用此压缩参数可以正常工作的读取功能。

def s3CsvToDf(file):
   with fs.open(file) as f:
      df = pd.read_csv(f, compression='gzip')
  return df
Run Code Online (Sandbox Code Playgroud)

写入问题的建议/替代方案?先感谢您!。

python amazon-s3 dask python-s3fs

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