问题标签 [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 回答
1097 浏览

python - 尽管语法正确,但 Memoryview 中的切片分配会引发 ValueError

所以我有这个代码

每当遇到最后一条语句时,它都会抛出如下错误:

0 投票
1 回答
156 浏览

python - Cython:优化原生 Python 内存视图

我有一个函数(来自外部 Python 库),它返回一个memoryview我想在 Cython 中处理的对象。

有没有办法将它转换为字节的类型化内存视图(没有副本)以提高效率?我该怎么做?这不起作用:

0 投票
2 回答
1374 浏览

python - Cython 中的内存视图数组

基于我之前的问题的这个答案,我想制作内存视图数组。

问题 1

构建具有固定长度的 2D 内存视图数组,例如

有了这个,我得到:

我尝试使用 C 指针数组:

但这也不起作用:

问题 2

构建一个任意长的 3D 数组,基本上是上述 2D 数组对象的列表。This other answer to a similar question and the Cython docs on allocating memory让我更接近了(我相信我应该使用malloc和指针,如果没有必要我不想引入C++)但我仍然遇到问题#1。欢迎任何建议!


编辑(问题#1):即使在混合中抛出一个 Cython 数组也会给我同样的错误:

现在我真的很困惑。为什么元组对 Cython 数组有好处,但对 memview 没有好处?

0 投票
0 回答
201 浏览

python - 将 numpy 2D 双复数数组作为 memoryview 传递给 cython

以下代码在 jupyter 笔记本中失败。但是,如果我使用 double 而不是 double complex,则一切正常。

双复数的错误是:

我需要在函数之外使用 numpy 并将其作为 memoryview 传递以启用与 nogil 的并行操作。

0 投票
0 回答
486 浏览

string - cython - 从 numpy 数组操作字符串

我无法在包含字符串的 numpy 数组上生成内存视图。最终目标是将字符串转换为整数。在这两者之间,我必须使用将strtok指针作为参数的 c 函数在适当的位置拆分字符串。因此,我不能简单地从 numpy 数组中传递元素,而必须按照此处所述创建内存视图。

这是我的代码

pxy 文件可以编译,但是当我尝试像这样使用它时

我收到一条错误消息char[::1] arr_memview = string_array: ValueError: Buffer dtype mismatch, expected end but got a string。(以后可能会出现更多错误。)

我认为这里以某种方式提供了我的问题的答案,但我不太了解它,无法让我的代码正常工作。例如,当我将有问题的行char[:,::1] arr_memview = string_array更改为并将循环中的第一行更改为token = strtok(&arr_memview[i,0], ':')我收到错误时ValueError: Buffer has wrong number of dimensions (expected 2, got 1)

0 投票
1 回答
170 浏览

python - 我还是不明白memoryview的观点

我通读了问题和答案或Python 中的 memoryview 到底是什么。我仍然不明白这一点。

答案中的示例起初似乎是合乎逻辑的,但是当我构造第三个测试用例时,我bytes按索引扫描对象时,它的速度与使用memoryview.

输出:

其中一个论点是,您可以简单地将 memoryview 对象传递给struct.unpack. 但是你绝对可以对字节对象做同样的事情。据我了解,归结为 memoryview 最终也必须复制切片。

如果您不做愚蠢的事情,那么坚持使用字节似乎要简单得多。

0 投票
1 回答
211 浏览

python - Memoryview 的规范 - Cython

我有一个函数,它给出了一个 memoryview 向量,我想计算该向量的范数。到目前为止,我通过将 memoryview 转换为 Numpy 数组并通过np.sqrt(V.dot(V)). 现在,出于速度原因,我想摆脱该步骤,但该程序在某些时候会因以下实现而失败。

我怀疑这是因为浮点运算妨碍了足够大的向量。是否有一种数值稳定的方法来计算 Cython 内存视图的范数?

更新

检查后发现舍入误差可能没有意义。相反,发生了一件非常奇怪的事情。我的实际功能如下所示:

我插入了print语句来检查结果“有多相等” norm。奇怪的是,现在一切正常,就像上面的代码一样。但是,当我注释掉第一个打印语句(第 1 行)时,代码运行良好,但在程序中不久就失败了。那里发生了什么?这不只是一个print不应该影响其他任何操作的声明吗?

更新 2

这是我尝试一个最小的、完整的和可验证的例子:

我认为没有必要了解该代码的作用。对我来说,真正的奥秘就是为什么这种print说法会有所作为。

因此,这段代码应该采取的是将一组非正交向量写成矩阵 A 中的列向量,并返回一个正交化矩阵,该矩阵对向量集进行正交归一化,如下所示:

代码风格中的正交归一化公式

所以 A_{orthonormal} 等价于代码中的 X 矩阵。当您将正交矩阵的转置与正交矩阵本身相乘时,您会得到单位矩阵,只要print语句 # line1 在那里,您就会得到统一矩阵。一旦你删除它,你也会得到非对角线条目,这意味着矩阵甚至不是正交的。为什么?

0 投票
1 回答
1351 浏览

python - 在 Python 中正确丢弃指向 mmap 内存的 ctypes 指针

我有一个问题,在创建指向它们的指针后,我无法在 Python 中正确关闭 mmap-s。我的用例是我打开文件(通常是与硬件一起使用的 UIO 设备,但问题也发生在普通文件上),对它们进行内存映射,然后将它们用作 ctypes 结构的缓冲区。通常是数据结构或数组。一个最小的示例如下所示:

那时一切都很好。

但是,有时我需要调用一些也需要访问该内存的 C 库函数,因此我必须传入指向它们的指针。我使用以下方法创建该指针:

除了一件事之外,所有这些都非常有效。一旦我创建了这样一个指针,我就无法再关闭内存映射。以这个稍微扩展的例子为例:

运行此程序会导致以下异常:

我已经对引用map-instance 的内容进行了一些分析(使用gc.get_referrers),结果发现memoryview-instance 仍然存在。最后,这可以追溯到 ctypes 数组:

但是,这并没有真正帮助我。我想知道如何摆脱那个指针。我知道这可能并不完全安全,因为我当然可以在某处拥有该指针的副本。但是完全防止mmap在创建指针之后关闭似乎也不是一个好主意。任何人都知道我如何让 Python 相信我丢弃了所有指针并且现在可以安全地关闭 mmap?

0 投票
0 回答
2428 浏览

python - 类型错误:参数 1 必须是只读字节类对象,而不是 memoryview

我正在将一个库从 Python 2 更新到 Python 3.7,该库从麦克风获取声音输入并将其转换为音高。但是,当我运行程序时出现此错误:

File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/analyse.py", line 58, in detect_pitch dp = analyseffi.detect_pitch(chunk2, min_frequency, max_frequency, samplerate, sens, ratio) TypeError: argument 1 must be read-only bytes-like object, not memoryview

它似乎与以下代码有关:

错误信息中chunk2的位置是通过chunk2 = samps.data[:]函数内获取的。我一直在试图弄清楚如何解决这个错误,但基于我有限的理解,“只读字节类对象”与“memoryview”非常相似。所以我不确定我应该怎么做才能从一个转换到另一个。

0 投票
2 回答
1014 浏览

python - Python:在单个操作中写入内存

我正在编写一个用户空间驱动程序,用于在 Python 3.5 中访问 FPGA 寄存器,它mmap是 FPGA 的 PCI 地址空间,获得一个memoryview以提供对内存映射寄存器空间的直接访问,然后用于struct.pack_into("<I", ...)将 32 位值写入选定的 32 -位对齐地址。

不幸的是,似乎struct.pack_into写入memset(buf, 0, ...)实际值之前清除了寄存器。通过检查 FPGA 中的写操作,我可以看到寄存器在设置真值之前设置为 0x00000000,因此 PCI 总线上至少有两次写入(实际上对于 32 位访问,有 3 个,两个 0写入,然后是实际数据。64 位涉及六次写入)。这会导致一些寄存器对写入操作的次数进行计数,或者一些“写入时清除”或在写入时触发某些事件的副作用。

我想使用另一种方法将寄存器数据一次性写入内存映射寄存器空间。我已经研究过了ctypes.memmove,它看起来很有希望(还没有工作),但我想知道是否还有其他方法可以做到这一点。

请注意,寄存器读取使用struct.unpack_from效果很好。

请注意,我还通过使用记录所有访问的 QEMU 驱动程序消除了 FPGA——在写入数据之前,我看到了相同的双零写入访问。