问题标签 [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 投票
0 回答
651 浏览

python - 实现支持memoryview和字节的`write()`方法的最佳方法是什么

背景

“wb”模式的write()文件对象方法同时支持memoryview和bytes:

当我使用推荐的 pyserial 方法时readline()

它引发了错误:IOError: raw write() returned invalid length 22.

我对此进行了调试,发现传递给ser.write()from 的对象io.BufferedRWPair是一个memoryview对象。在ser.write() 它用于bytes(data)转换传递对象的代码中,它得到类似“<memory at 0x061F54E0>”的内容。

问题

如果我需要实现write()方法,那么使它可以同时处理对象的最佳方法是memoryview什么bytes

以下是我想出的:

  • 利用isinstance()
  • data = memoryview(data).tobytes()
0 投票
1 回答
372 浏览

python - Numpy 设置数组内存

我有一个关于 numpys 内存视图的问题:

假设我们有两个带内存的数组:

我们在框架中使用这些 ( x, y),因此我们不能只是重新定义它们,因为用户可能已经为自己链接了它们(如在 中y_ref)。现在我们想将他们的记忆合并到一个视图中。因此,单个视图p与两个数组共享内存。

我是通过以下方式做到的,但不知道这是否会导致内存泄漏:

因此,我们现在可以对单个视图p或其中一个数组进行操作,而无需重新定义对它们的每个引用

甚至y_ref得到了更新:

这是将数组的内存设置为另一个数组的视图的正确方法吗?

有没有一种明显的方法来统一我公然失踪的数组内存?

我不确定旧数据缓冲区会发生什么xy因为它们现在超出了范围。他们会被解除分配吗?

更新感谢@Jaime:

p.size在我申请的数据集(微生物学)上可以变得非常大(数十亿)。此外,此主题用于具有潜在深层结构的框架中,因此更新所有本地版本可能会变得昂贵。所有参数的更新都需要在优化循环中完成,因此将所有内容都保存在内存中至关重要。

实际上,您的方法是我最初的方法,因为使用 python 层次结构遍历来更新所有本地副本效率低下。

0 投票
3 回答
1248 浏览

python - 将 cython 中的 numpy 数据分配给视图

我正在尝试将 linalg 反函数(la.inv)的输出分配给 cython 中的视图。不幸的是,这不起作用。我总是可以将 la.inv() 的输出分配给一个临时的 ndarray 对象,然后将其内容复制到视图中。

有没有更好的方法来做到这一点。

输出:

0 投票
3 回答
20700 浏览

python - Cython Numpy 在使用 MemoryView 时发出关于 NPY_NO_DEPRECATED_API 的警告

我正在将 Cython memoryview 转换为 numpy 数组(以便能够在纯 Python 代码中使用它):

它编译,但编译器给出以下警告:

我在 setup.py 中添加了建议的指令:

现在它不会编译,它说:

我应该怎么办?可以保留已弃用的 API 调用吗?它试图进入该base领域——但我没有这样做,这是 Cython 的错。我只是将 memoryview 转换为 numpy 数组。还有另一种更清洁/更安全的方法吗?

0 投票
2 回答
10160 浏览

c - 如何在 Cython 中动态声明二维 c 数组

我需要使用各种大小的 2D numpy 数组执行大量工作,并且我想将这些计算卸载到 cython 上。这个想法是,我的 2D numpy 数组将从 python 传递到 cython,在那里它将被转换为 c 数组或内存视图,并在其他 c 级函数的级联中使用来进行计算。

经过一些分析后,由于一些严重的 python 开销,我排除了在 cython 中使用 numpy 数组。使用内存视图要快得多并且非常容易使用,但我怀疑我可以通过使用 c-arrays 来获得更多的加速。

不过,这是我的问题 - 如何在 cython 中声明 2D c 数组而不用设定值预定义其尺寸?例如,我可以通过这种方式从 numpy 创建一个 c 数组:

然后将其传递给函数:

但这意味着我有一个固定大小的数组,在我的情况下这将是无用的。所以我尝试了这样的事情:

打算将其传递给这样的函数:

但它不起作用,编译失败并出现错误“不允许在常量表达式中”。我怀疑我不需要以某种方式使用 malloc/free 吗?我看过这个问题(如何在 Cython 中声明 2D 列表),但它没有为我的问题提供答案。

更新:

事实证明,如果确保为内存视图关闭 cython 中的 indexError 检查,则内存视图可以与 c 数组一样快,这可以通过使用 cython 编译器指令来完成:

感谢@Veedrac 的提示!

0 投票
2 回答
109 浏览

python - 迭代 nD 数组的通用函数

使用 Cython,有没有办法编写适用于不同维度数组的快速通用函数?例如对于这个简单的去锯齿函数案例:

在这里,我需要针对一维、二维和三维情况的三个函数。有没有一种好的方法来编写一个可以为所有(合理的)维度完成工作的函数?

PS:在这里,我尝试使用 memoryviews,但我不确定这是正确的方法。我很惊讶命令if where_dealiased[i0]: data[ik, i0] = 0.生成的带注释的 html 中的行不是白色的cython -a。有什么不对?

0 投票
2 回答
3562 浏览

python - 有效地初始化 Cython Memoryview

我目前MemoryView在我的 Cythonpyx文件中设置我的 s 如下:

当我编译pyx文件时,生成的带注释文件中cython -a foo.pyx的行显示为深黄色(这意味着它有很多 Python 调用会减慢速度。)cdef int[:] x = np.empty(10)html

如何更好地实例化我键入的 Memoryview?

0 投票
3 回答
2894 浏览

python - 如何在 Cython 的新型缓冲区对象中包装 C 指针和长度?

我正在 Cython 中编写一个 Python 2.7 扩展模块。 如何创建一个 Python 对象来实现新样式的缓冲区接口,该接口包装了 C 库给我的一大块内存? 内存块只是一串字节,而不是结构或多维数组。我得到了一个const void *指针和一个长度,以及一些关于指针保持有效时间的详细信息。

我无法复制内存——这会降低我的应用程序的性能。

使用旧式缓冲区对象,我可以简单地使用PyBuffer_FromMemory(),但我似乎找不到类似的简单方法来生成新式缓冲区对象。

我是否必须创建自己的实现缓冲区接口的类?或者 Cython 是否提供了一种简单的方法来做到这一点?

我已经阅读了Cython 文档中的Unicode 和 Passing StringsTyped Memoryviews页面,但是该文档不精确且不是很完整,并且没有与我想要做的类似的示例。

这是我尝试过的(test.pyx):

0 投票
2 回答
2769 浏览

python - 如何使用 Cython 类型的内存视图来接受来自 Python 的字符串?

如何编写一个 Cython 函数,它将字节字符串对象(普通字符串、字节数组或其他遵循缓冲区协议的对象)作为类型化的 memoryview

根据Unicode 和传递字符串Cython 教程页面,以下应该可以工作:

它适用于字节数组和其他可写缓冲区:

但它不适用于普通字符串和其他只读缓冲区对象:

查看生成的 C 代码,Cython 总是将PyBUF_WRITABLE标志传递给PyObject_GetBuffer(),这解释了异常。

我可以自己手动查看缓冲区对象,但这并不方便:

我做错了什么,还是 Cython 不支持将只读缓冲区对象(例如普通字符串)强制转换为类型化的 memoryview 对象?

0 投票
0 回答
53 浏览

python - 创建视图的 Numpy 操作

上的一些numpy操作ndarray创建原始数组的视图而不是新数组,例如切片索引和转置。

有人可以给我或指向我此类操作的完整列表吗?