标签: memoryview

为什么不能从数组对象中获取Py_buffer?

数组上python文档清楚地表明该数组符合缓冲区接口.它甚至建议不使用buffer_info()方法.但是当我尝试使用PyObject_GetBuffer()从C/C++代码中获取Py_Buffer或使用python的memoryview时,我得到了一个失败.

例如,在python中(我使用的是2.7版):

>>> a = array.array('c')
>>> memoryview(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot make memory view because object does not have the buffer interface
Run Code Online (Sandbox Code Playgroud)

实际上,当我搜索python的代码库时,只有bytearrayobject(bytearray),memoryobject(memoryview)和stringobject(str)在它们上面设置了所需的Py_TPFLAGS_HAVE_NEWBUFFER标志.据我了解,文档是错误的; 数组不支持缓冲区接口.

我可以使用支持缓冲区接口的bytearray,问题是我需要数组的实用fromfile()方法来读取我可以在我的C/C++代码中使用的缓冲区.

有没有一种方法可以让我将文件读入缓冲区并使用C代码中的缓冲区,而不涉及内存副本?(我想处理大二进制文件,复制是一个不太理想的选择).

python arrays buffer memoryview pep3118

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

mpi4py中的共享内存

我使用MPImpi4py)脚本(在单个节点上),该脚本可用于非常大的对象。为了让所有进程都可以访问该对象,我通过分发了该对象comm.bcast()。这会将对象复制到所有进程,并占用大量内存,尤其是在复制过程中。因此,我想共享诸如指针之类的东西,而不是对象本身。我发现一些memoryview有用的功能有助于增强流程中对象的工作。同样,对象的实际内存地址也可以通过memoryview对象字符串表示形式进行访问,并且可以这样分配:

from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

if rank:
    content_pointer = comm.bcast(root = 0)
    print(rank, content_pointer)
else:
    content = ''.join(['a' for i in range(100000000)]).encode()
    mv = memoryview(content)
    print(mv)
    comm.bcast(str(mv).split()[-1][: -1], root = 0)
Run Code Online (Sandbox Code Playgroud)

打印:

<memory at 0x7f362a405048>
1 0x7f362a405048
2 0x7f362a405048
...
Run Code Online (Sandbox Code Playgroud)

这就是为什么我认为必须有一种方法可以在另一个过程中重构对象。但是,我在文档中找不到有关如何执行此操作的线索。

简而言之,我的问题是:是否可以在中同一节点上的进程之间共享对象mpi4py

mpi shared-memory python-3.x memoryview mpi4py

6
推荐指数
2
解决办法
1928
查看次数

“*”的操作数类型无效(double[::1];double[::1])

我在班级中实例化了内存视图,如下所示:

from __future__ import division
import numpy as np
import pylab as plt
cimport numpy as np
cimport cython
cdef class fit(object):
     cdef public double[::1] shear_g1, shear_g2, shear_z, halo_pos_arcsec
     cdef public double[:,::1] shear_pos_arcsec, source_zpdf

     cdef char* path
     cdef double omega_m, omega_l, h, sigma_g

     @cython.boundscheck(False)
     @cython.cdivision(True)
     @cython.wraparound(False)
     @cython.nonecheck(False)
     def __init__(self, shear_g1, shear_g2, shear_pos_arcsec, shear_z, halo_pos_arcsec, double halo_z, source_zpdf, sigma_g, path=None, omega_m=None, omega_l=None, h=None ):

         self.shear_g1 = shear_g1
         self.shear_g2 = shear_g2
         self.shear_pos_arcsec = shear_pos_arcsec
         self.shear_z  = shear_z
         self.halo_pos_arcsec  = halo_pos_arcsec
         self.halo_z    = …
Run Code Online (Sandbox Code Playgroud)

python cython memoryview

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

将 Numpy 数组复制到内存视图

memoryview在一个numpy数组上有一个,并希望使用以下命令将另一个numpy数组的内容复制到其中memoryview

import numpy as np
cimport numpy as np

cdef double[:,::1] test = np.array([[0,1],[2,3]], dtype=np.double)

test[...] = np.array([[4,5],[6,7]], dtype=np.double)
Run Code Online (Sandbox Code Playgroud)

但为什么这是不可能的呢?它让我一直在说

类型错误:只有长度为 1 的数组可以转换为 Python 标量 Blockquote

如果我从 a 复制memoryview到 a memoryview,或者从numpy数组numpy复制到数组,它工作正常,但是如何从numpy数组复制到 a memoryview

numpy cython memoryview

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

Python Memoryview vs Bytearray?

我应该什么时候在 Python2.7 中使用memoryview?我只是找不到在常规bytearray上使用它的任何好处。此外,memoryview不支持字符串方法,这使其绝对无法使用。我错了吗?

python arrays memoryview

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

How to flatten a memoryview?

I have a memoryview with non-trivial strides like the following:

>>> mv.strides
(96, 32, 8)
Run Code Online (Sandbox Code Playgroud)

I want to write this memoryview to a socket but my networking library seems to expect memoryviews with mv.strides == (1,). Is there a way in Python to flatten this memoryview?

>>> flatten(mv).strides
(1,)
Run Code Online (Sandbox Code Playgroud)

Ideally this would neither affect the underlying bytes nor require a copy. I could do this with NumPy, but I'd rather keep things general if possible.

Edit: Here is …

python memoryview

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

TypeError:运行基本的add.delay(1,2)测试时无法腌制memoryview对象

尝试使用celery 4.1.0和Python 3.6.4运行add.delay(1,2)的最基本测试,并得到以下错误:

[2018-02-27 13:58:50,194:INFO / MainProcess]收到的任务:exb.tasks.test_tasks.add [52c3fb33-ce00-4165-ad18-15026eca55e9]
[2018-02-27 13:58:50,194:CRITICAL / MainProcess]无法恢复的错误:SystemError('返回带有错误集的结果',)追溯(最近一次调用为最后):文件“ / opt / myapp / lib / python3 .6 / site-packages / kombu / messaging.py”,行_receive_callback中的行624,如果on_m则返回on_m(message),否则self.receive(已解码,消息)返回文件“ /opt/myapp/lib/python3.6/site-包/celery/worker/consumer/consumer.py”,行570,在on_task_received回调中,文件“ /opt/myapp/lib/python3.6/site-packages/celery/worker/strategy.py”,行145,在task_message_handler句柄(必需)文件“ /opt/myapp/lib/python3.6/site-packages/celery/worker/worker.py”,第221行,在_process_task_sem中返回self._quick_acquire(self._process_task,req)文件“ / opt / myapp / lib / python3。6 / site-packages / kombu / async / semaphore.py“,第62行,在获取回调中(* partial_args,** partial_kwargs)文件” /opt/myapp/lib/python3.6/site-packages/celery/worker/ _process_task req.execute_using_pool(self.pool)文件中的worker.py”第226行,execute_using_pool相关性_id的文件“ /opt/myapp/lib/python3.6/site-packages/celery/worker/request.py”,第531行= task_id,文件“ /opt/myapp/lib/python3.6/site-packages/celery/concurrency/base.py”,行155,位于apply_async ** options中)文件“ /opt/myapp/lib/python/3.6 /site-packages/billiard/pool.py“,行1486,位于apply_async self._quick_put((TASK,(result._job,None,func,args,kwds)))文件” / opt / myapp / lib / python3。 6 / site-packages / celery / concurrency / asynpool.py“,行813,位于send_job主体= dumps(tup,protocol = protocol)TypeError:无法腌制memoryview对象

上面的异常是以下异常的直接原因: …

pickle typeerror celery python-3.x memoryview

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

Cython:memoryviews的size属性

我在Cython中使用了很多3D内存视图,例如

cython.declare(a='double[:, :, ::1]')
a = np.empty((10, 20, 30), dtype='double')
Run Code Online (Sandbox Code Playgroud)

我经常想要遍历所有元素a.我可以使用三重循环来做到这一点

for i in range(a.shape[0]):
    for j in range(a.shape[1]):
        for k in range(a.shape[2]):
            a[i, j, k] = ...
Run Code Online (Sandbox Code Playgroud)

如果我不关心指数i,j并且k,它是更有效地做一个扁平环形,像

cython.declare(a_ptr='double*')
a_ptr = cython.address(a[0, 0, 0])
for i in range(size):
    a_ptr[i] = ...
Run Code Online (Sandbox Code Playgroud)

在这里,我需要知道size数组中的elements()数量.这由shape属性中的元素的乘积给出,即size = a.shape[0]*a.shape[1]*a.shape[2],或更一般地size = np.prod(np.asarray(a).shape).我发现这些都很难写,而且(虽然很小)的计算开销困扰着我.这样做的好方法是使用sizememoryviews 的builtin 属性size = a.size.但是,由于我无法理解的原因,这导致未经优化的C代码,从Cython生成的注释html文件中可以看出.具体来说,生成的C代码size = a.shape[0]*a.shape[1]*a.shape[2]很简单

__pyx_v_size = (((__pyx_v_a.shape[0]) * (__pyx_v_a.shape[1])) …
Run Code Online (Sandbox Code Playgroud)

python attributes cython memoryview typed-memory-views

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

是否有零复制方法从内存视图创建字节数组?

我遇到了一个我认为非常简单的问题(我希望如此!),即从内存中取出原始数据,并将其解码为 Unicode 字符串。

这样做是显而易见的方法,并且有效:

the_string = mv.tobytes().decode("utf-8")
Run Code Online (Sandbox Code Playgroud)

其中 mv 是有问题的内存视图。但这违背了零复制的目的,因为副本是由 tobytes() 方法生成的。因此,接下来要尝试的是将内存视图“转换”为字节数组。换句话说,创建一个使用内存视图“mv”作为其支持数据的字节数组。我认为这很简单,但我不知道如何做到这一点。有谁知道怎么做吗?

python arrays buffer decode memoryview

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

为什么 numpy 记录的内存视图是只读的?

为什么 Python 告诉我记录的内存视图是只读的?

>>> x = np.zeros(1, dtype='d,d,i')
>>> x
array([(0., 0., 0)], dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
>>> memoryview(x).readonly
False
>>> memoryview(x[0]).readonly
True
Run Code Online (Sandbox Code Playgroud)

显然,x[0]不是只读的,因为

>>> x[0][0] += 1
>>> x[0]
(1., 0., 0)
Run Code Online (Sandbox Code Playgroud)

内存视图对于普通数组没有问题:

>>> y = np.zeros((3, 4))
>>> memoryview(y).readonly
False
>>> memoryview(y[0]).readonly
False
Run Code Online (Sandbox Code Playgroud)

同样,不推荐使用的人__array_info__知道它x[0]是读写的:

>>> x.__array_interface__['data']   # returns tuple (address, read-only)
(105553143159680, False)
>>> x[0].array_interface__['data']
(105553143159680, False)
Run Code Online (Sandbox Code Playgroud)

我的实际问题是 C 代码。幸运的是,我的所有问题也可以用纯 Python 显示。

我正在尝试用 C 代码读取和写入 numpy 记录,我只需要数据的地址。__array_interface__我可以使用它相应的 C-side找到数据的地址 …

python swig memoryview

5
推荐指数
0
解决办法
88
查看次数