问题标签 [memoryview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
910 浏览

python - 如何将一片内存视图转换为 C 字符串(无符号字符 *)?

以下是我遇到此问题的代码:

对于一个简单的例子来说,这可能有点太多的代码,但如果你仔细想想,它真的没有那么多。循环之前的部分处理过滤掉各种边缘情况——它们对这个问题不感兴趣。唯一重要的部分是第一个参数必须实现缓冲区协议,第二个参数是文件名。

因此,为了写入文件,我想获取一片内存视图,然后将其传递给一个 C 函数,该函数需要一个指向unsigned char. 对于我的一生,我无法弄清楚如何使用 Cython 来做到这一点......我尝试了上面代码的各种排列,但是,在大多数情况下,我得到了

存储临时 Python 引用的不安全 C 派生

没有任何暗示它试图生成什么。

上面的代码也有一些重复,因为我不知道如何使用in_view.buf[x]它并让它具有我需要的类型。我把它留在这里只是为了表明我也尝试过。


对类似问题的答案不起作用,因为 Cython 内存视图有错误。我会很感激一个不同的答案。

0 投票
2 回答
3108 浏览

arrays - 将 numpy 数组转换为 MemoryView 对象

我正在尝试将 numpy 数组转换为MemoryView对象,因为我必须在两个程序之间进行通信。一个只能处理 NumPy 数组,另一个只能处理 MemoryView 对象。

从 MemoryView 转换为 numpy 数组很容易通过以下方式完成:

但是如何从 numpy 数组转换为 MemoryView?

我在这里找到:https://docs.python.org/3/c-api/memoryview.html有一个 PyMemoryView_FromObject(PyObject *obj) 函数,但我不知道如何在没有示例的情况下调用它。

谢谢!

0 投票
0 回答
42 浏览

python - 如何检索 memoryview 的完整状态信息?

我正在编写一个序列化程序,而memoryview对象给我带来了麻烦。我需要知道在反序列化时重新创建相同内存视图所需的所有属性,但我不知道如何访问它们。


想象一下,我有一个这样的内存视图:

obj我可以通过属性访问原始字节对象:

但是我怎样才能得到索引25,即内存视图的边界?

我尝试了文档中列出的所有属性,但似乎没有一个包含我需要的信息:

如何提取内存视图的边界?

0 投票
1 回答
252 浏览

python - Cython 使用 memoryviews 崩溃

移除 gil 并使用内存视图时,会出现此错误:

同一个对象以前作为内存视图工作得很好。有关更多详细信息,请参见下面的代码。

这就是设置。该错误来自带有 gil 注释的 # 行。如果我使用 gil,程序会变慢很多。此外,在另一个函数中使用相同的对象作为内存视图也可以很好地工作。我不明白这一点。

然后是其余的功能。

0 投票
1 回答
3705 浏览

python-3.x - TypeError: can't pickle memoryview objects when running basic add.delay(1,2) test

尝试使用 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('返回了带有错误集的结果') Traceback(最近一次调用最后):文件“/opt/myapp/lib/python3 .6/site-packages/kombu/messaging.py",第 624 行,在 _receive_callback 返回 on_m(message) if on_m else self.receive(decoded, message) File "/opt/myapp/lib/python3.6/site- packages/celery/worker/consumer/consumer.py”,第 570 行,在 on_task_received 回调中,文件“/opt/myapp/lib/python3.6/site-packages/celery/worker/strategy.py”,第 145 行,在task_message_handler handle(req) File "/opt/myapp/lib/python3.6/site-packages/celery/worker/worker.py", line 221, in _process_task_sem return self._quick_acquire(self._process_task, req) File "/选择/myapp/lib/python3.6/site-packages/kombu/async/semaphore.py”,第 62 行,在获取回调(*partial_args,**partial_kwargs)文件“/opt/myapp/lib/python3.6/site-packages/celery/worker/ worker.py”,第 226 行,_process_task req.execute_using_pool(self.pool) 文件“/opt/myapp/lib/python3.6/site-packages/celery/worker/request.py”,第 531 行,execute_using_pool correlation_id =task_id,文件“/opt/myapp/lib/python3.6/site-packages/celery/concurrency/base.py”,第 155 行,在 apply_async **options) 文件“/opt/myapp/lib/python3.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 body = dumps(tup,协议=协议)类型错误:不能腌制内存视图对象

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

Traceback(最近一次调用最后一次):文件“/opt/myapp/lib/python3.6/site-packages/celery/worker/worker.py”,第 203 行,在 start self.blueprint.start(self) 文件中“/ opt/myapp/lib/python3.6/site-packages/celery/bootsteps.py”,第 119 行,在 start step.start(parent) 文件“/opt/myapp/lib/python3.6/site-packages/celery /bootsteps.py”,第 370 行,开始返回 self.obj.start() 文件“/opt/myapp/lib/python3.6/site-packages/celery/worker/consumer/consumer.py”,第 320 行,在开始 blueprint.start(self) 文件“/opt/myapp/lib/python3.6/site-packages/celery/bootsteps.py”,第 119 行,在 start step.start(parent) 文件“/opt/myapp/ lib/python3.6/site-packages/celery/worker/consumer/consumer.py”,第 596 行,在 start c.loop(*c.loop_args()) 文件中“/opt/myapp/lib/python3.6/site-packages/celery/worker/loops.py”,第 88 行,在 asynloop next(loop) 文件中“/opt/myapp/lib/python3.6/site-packages/ kombu/async/hub.py”,第 354 行,在 create_loop cb(*cbargs) 文件“/opt/myapp/lib/python3.6/site-packages/kombu/transport/base.py”,第 236 行,在 on_readable阅读器(循环)文件“/opt/myapp/lib/python3.6/site-packages/kombu/transport/base.py”,第 218 行,在 _read drain_events(timeout=0) 文件“/opt/myapp/lib/ python3.6/site-packages/librabbitmq-2.0.0-py3.6-linux-x86_64.egg/librabbitmq//opt/myapp/lib/python3.6/site-packages/kombu/transport/base.py”,第 236 行,在 on_readable 阅读器(循环)文件“/opt/myapp/lib/python3.6/site-packages/ kombu/transport/base.py”,第 218 行,在 _read drain_events(timeout=0) 文件“/opt/myapp/lib/python3.6/site-packages/librabbitmq-2.0.0-py3.6-linux-x86_64 .egg/librabbitmq//opt/myapp/lib/python3.6/site-packages/kombu/transport/base.py”,第 236 行,在 on_readable 阅读器(循环)文件“/opt/myapp/lib/python3.6/site-packages/ kombu/transport/base.py”,第 218 行,在 _read drain_events(timeout=0) 文件“/opt/myapp/lib/python3.6/site-packages/librabbitmq-2.0.0-py3.6-linux-x86_64 .egg/librabbitmq/init .py",第 227 行,在 drain_events self._basic_recv(timeout) SystemError:返回带有错误集的结果

我找不到任何以前的证据表明有人遇到此错误。我从 celery 网站注意到,仅提到支持 python 3.5,这是问题还是我缺少的东西?

任何帮助将非常感激!

更新:尝试使用 Python 3.5.5 并且问题仍然存在。尝试使用 Django 4.0.2 并且问题仍然存在。

更新:卸载 librabbitmq 并且问题停止了。这是在从 Python 2.7.5、Django 1.7.7 迁移到 Python 3.6.4、Django 2.0.2 之后看到的。

0 投票
0 回答
113 浏览

cython - 在 cython 中创建更简洁的内存视图矩阵

我在做什么

我有很多微小的矩阵(3x3、5x5、3x4 等),其大小在编译时是已知的。直到现在我使用 numpy 来创建这些

并像使用内存视图一样使用 numpy 数组。现在,我想摆脱这些 numpy 调用,转而使用 C 数组(或类似的非动态分配的快速数组)。我做了以下事情:

当然,最后一行取决于将元素设置为零的重要性。对于动态大小的数组,我这样做:

我对此很满意。

我想做什么

我想用更简洁的方式来做到这一点。我知道为了简洁起见,我可以实现一个像这里描述的类:

Cython:创建没有 NumPy 数组的内存视图?

但这不是在编译时已知大小的 ac 数组。也许有一种方法可以使用带参数的 DEF 宏?像这样:

也许我还缺少一种简单的方法来创建具有非动态分配数据的向量/矩阵的 cdef 类。

0 投票
3 回答
4342 浏览

python - 带有 Cython 的布尔 numpy 数组

我有一个 numpy 布尔数组:

如果我尝试用它初始化 Cython MemoryView,如下所示:

我收到此错误:

如果我这样做,它工作正常:

如何使用 Cython MemoryViews 存储布尔 numpy 数组?

0 投票
2 回答
3085 浏览

string - 如何在 Python 3 字符串上使用 memoryview?

在 Python 3 中,执行:

产生错误:

我应该怎么做才能memoryview接受字符串,或者我应该对我的字符串进行什么转换才能被接受memoryview

0 投票
1 回答
3140 浏览

python - Passing/Returning Cython Memoryviews vs NumPy Arrays

I am writing Python code to accelerate a region properties function for labeled objects in a binary image. The following code will calculate the number of border pixels of a labeled object in a binary image given the indices of the object. The main() function will cycle through all labeled objects in a binary image 'mask' and calculate the number of border pixels for each one.

I am wondering what the best way is to pass or return my variables in this Cython code. The variables are either in NumPy arrays or typed Memoryviews. I've messed around with passing/returning the variables in the different formats, but cannot deduce what the best/most efficient way is. I am new to Cython so Memoryviews are still fairly abstract to me and whether there is a different between the two methods remains a mystery. The images I am working with contain 100,000+ labeled objects so operations such as these need to be fairly efficient.

To summarize:

When/should I pass/return my variables as typed Memoryviews rather than NumPy arrays for very repetitive computations? Is there a way that is best or are they exactly the same?

0 投票
2 回答
1288 浏览

python - Cython:内存视图的大小属性

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

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

如果我不关心索引i,jk,则执行平面循环会更有效,例如

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

其中生成的 C 代码size = a.size

为了生成上述代码,我通过编译器指令启用了所有可能的优化,这意味着无法优化生成的笨重的 C 代码a.size。在我看来,size“属性”并不是真正的预先计算的属性,而是在查找时实际执行计算。此外,这种计算比简单地用乘积代替shape属性要复杂得多。我在文档中找不到任何解释的提示。

a.shape[0]*a.shape[1]*a.shape[2]这种行为的解释是什么,如果我真的关心这个微优化,我有比写出更好的选择吗?