问题标签 [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.
python - 带有 Cython 的布尔 numpy 数组
我有一个 numpy 布尔数组:
如果我尝试用它初始化 Cython MemoryView,如下所示:
我收到此错误:
如果我这样做,它工作正常:
如何使用 Cython MemoryViews 存储布尔 numpy 数组?
python - Cython:内存视图的大小属性
我在 Cython 中使用了很多 3D 内存视图,例如
我经常想遍历a
. 我可以使用三重循环来做到这一点
如果我不关心索引i
,j
和k
,则执行平面循环会更有效,例如
在这里,我需要知道size
数组中元素 ( ) 的数量。这是由属性中元素的乘积给出的shape
,即size = a.shape[0]*a.shape[1]*a.shape[2]
,或更一般地size = np.prod(np.asarray(a).shape)
。我发现这两个都很难写,而且(尽管很小)的计算开销让我很困扰。这样做的好方法是使用size
memoryviews 的内置属性,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]
这种行为的解释是什么,如果我真的关心这个微优化,我有比写出更好的选择吗?
python - Cython:优化原生 Python 内存视图
我有一个函数(来自外部 Python 库),它返回一个memoryview
我想在 Cython 中处理的对象。
有没有办法将它转换为字节的类型化内存视图(没有副本)以提高效率?我该怎么做?这不起作用:
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 没有好处?
exception-handling - Cython:返回类型化内存视图的函数的异常类型
在cdef
函数的签名中:
我要放<????>
什么?
如果我正确理解了文档,那么指定异常类型对于将异常传播到 Python 堆栈是必要的。
我尝试了一些[b'\x00']
空的 Cython 数组,但没有任何效果。
python - Cython - 有效过滤类型化的内存视图
此 Cython 函数返回 numpy 数组的元素中的一个随机元素,该元素在一定范围内:
这工作得很好。但是,此功能对我的代码的性能非常关键。类型化的内存视图显然比 numpy 数组快得多,但它们不能以与上述相同的方式进行过滤。
我如何使用类型化的 memoryviews 编写一个与上述功能相同的函数?还是有其他方法可以提高功能的性能?
python-3.x - cython中memoryviews的地址相同但指向不同的对象
问题
在 cython 中定义不同的对象时,内存视图将返回相同的地址。但是,数组本身在索引时会被修改。
背景。
我有用 cython 编写的基类和派生类。我注意到,当我对类应用多处理时,底层缓冲区在不同的进程中发生了变化,这不是有意的。在酸洗过程中,我编写了一个简单的 __reduce__ 方法和 __deepcopy__ 方法来重建原始对象。为了清楚起见,我降低了下面代码的复杂性。现在我的问题是,为什么内存视图返回相同的地址?此外,为什么即使 memoryview 相同,numpy 数组本身也会正确更改
输出:
python-3.x - 使用整数的 memoryview 索引 Cython memoryview
使用 Cython,我尝试这样做:
编译器抱怨:
指定的内存视图索引无效,键入 int[:]
如何使用某种整数数组索引此内存视图?只允许切片吗?我可以轻松地使用基于“数组”的索引和旧的 NumPy 数组缓冲区支持。(我只是调整了我的代码以使用 memoryviews 来查看它是否会提高性能,但它实际上会中断......)
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**
公开缓冲区协议
python - Cython:理解具有间接连续内存布局的类型化内存视图
我想了解更多关于 Cython 令人敬畏的typed-memoryviews和 memory layout 的信息indirect_contiguous
。
根据文档 indirect_contiguous
,当“指针列表是连续的”时使用。
还有一个示例用法:
因此,如果我错了,请纠正我,但我假设“指向连续整数列表的指针的连续列表”意味着类似于由以下 c++ 虚拟代码创建的数组:
因此,如果我理解正确,那么在我的 Cython 代码中应该可以从int**
这样的代码中获取内存视图:
但我得到编译错误:
我做错什么了?我错过了任何演员还是我误解了indirect_contiguous的概念?