问题标签 [typed-memory-views]

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 投票
3 回答
4342 浏览

python - 带有 Cython 的布尔 numpy 数组

我有一个 numpy 布尔数组:

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

我收到此错误:

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

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

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]这种行为的解释是什么,如果我真的关心这个微优化,我有比写出更好的选择吗?

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 投票
1 回答
441 浏览

exception-handling - Cython:返回类型化内存视图的函数的异常类型

cdef函数的签名中:

我要放<????>什么?

如果我正确理解了文档,那么指定异常类型对于将异常传播到 Python 堆栈是必要的。

我尝试了一些[b'\x00']空的 Cython 数组,但没有任何效果。

0 投票
1 回答
885 浏览

python - Cython - 有效过滤类型化的内存视图

此 Cython 函数返回 numpy 数组的元素中的一个随机元素,该元素在一定范围内:

这工作得很好。但是,此功能对我的代码的性能非常关键。类型化的内存视图显然比 numpy 数组快得多,但它们不能以与上述相同的方式进行过滤。

我如何使用类型化的 memoryviews 编写一个与上述功能相同的函数?还是有其他方法可以提高功能的性能?

0 投票
1 回答
410 浏览

python-3.x - cython中memoryviews的地址相同但指向不同的对象

问题

在 cython 中定义不同的对象时,内存视图将返回相同的地址。但是,数组本身在索引时会被修改。

背景。

我有用 cython 编写的基类和派生类。我注意到,当我对类应用多处理时,底层缓冲区在不同的进程中发生了变化,这不是有意的。在酸洗过程中,我编写了一个简单的 __reduce__ 方法和 __deepcopy__ 方法来重建原始对象。为了清楚起见,我降低了下面代码的复杂性。现在我的问题是,为什么内存视图返回相同的地址?此外,为什么即使 memoryview 相同,numpy 数组本身也会正确更改

输出:

0 投票
2 回答
1110 浏览

python-3.x - 使用整数的 memoryview 索引 Cython memoryview

使用 Cython,我尝试这样做:

编译器抱怨:

指定的内存视图索引无效,键入 int[:]

如何使用某种整数数组索引此内存视图?只允许切片吗?我可以轻松地使用基于“数组”的索引和旧的 NumPy 数组缓冲区支持。(我只是调整了我的代码以使用 memoryviews 来查看它是否会提高性能,但它实际上会中断......)

0 投票
1 回答
808 浏览

python - Cython - 动态 2D C++Array 的 Memoryview

目标:使用 Cython 从 2D C++ 字符数组中获取 Memoryview。

一点背景:

我有一个本地 C++ 库,它生成一些数据并通过 a 返回char**到 Cython 世界。数组在库中初始化和操作如下:

所以我们基本上得到了一个嵌套子数组的数组。

旁注:
- 每行具有相同的列数
- 行可以共享内存,即指向相同的 row_data

目标是将此数组与 memoryview 一起使用,最好不要进行昂贵的内存复制。


第一种方法(不工作)

使用 Cython 数组和内存视图:

这是应该使用生成的数据的 .pyx 文件

这实际上编译得很好并且运行没有崩溃,但结果并不完全符合我的预期。如果我打印出 NumPy 数组的值,我会得到:

事实证明,第一行被正确映射,但其他行看起来更像是未初始化的内存。因此,可能与char**2D 内存视图的内存布局和默认模式不匹配。


编辑#1:我从另一个问题中学到的是内置的 cython 数组不支持间接内存布局,所以我必须为它创建一个 cython-wrapper 来unsigned char**公开缓冲区协议

0 投票
1 回答
826 浏览

python - Cython:理解具有间接连续内存布局的类型化内存视图

我想了解更多关于 Cython 令人敬畏的typed-memoryviews和 memory layout 的信息indirect_contiguous

根据文档 indirect_contiguous,当“指针列表是连续的”时使用。

还有一个示例用法:

因此,如果我错了,请纠正我,但我假设“指向连续整数列表的指针的连续列表”意味着类似于由以下 c++ 虚拟代码创建的数组:

因此,如果我理解正确,那么在我的 Cython 代码中应该可以从int**这样的代码中获取内存视图:

但我得到编译错误:

我做错什么了?我错过了任何演员还是我误解了indirect_contiguous的概念?