问题标签 [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.
cython - Cython 编译器与数组崩溃——为什么?
我正在尝试使用 memoryview 将以前的 python 代码转换为 cython,并且我不断从第一 bolo 行(靠近底部)得到编译器崩溃:
当我尝试编译代码时,它会引发非特定错误“ExpandInplaceOperators 中的编译器崩溃”。我完全迷路了。
python - 如何展平内存视图?
我有一个memoryview
不平凡的进步,如下所示:
我想将其写入memoryview
套接字,但我的网络库似乎期望使用mv.strides == (1,)
. Python中有没有办法把它弄平memoryview
?
理想情况下,这既不会影响底层字节,也不需要副本。我可以用 NumPy 做到这一点,但如果可能的话,我宁愿保持一般性。
编辑:这是一些产生这样一个内存视图的代码
struct - cython 结构中的 memoview ......如何分配给它们?(SIGSEGV)
我想我有一个类似的问题:
我定义了一个包含内存视图的结构:
现在我初始化这样一个结构:
现在忽略matmul
(它是一个经过良好测试的 cython 函数来计算矩阵乘法)。我得到的错误是instance.A = ...
分配行的 SIGSEGV (11)。似乎它应该工作(qua类型)。事实上,如果 A 不在结构内,则此分配将起作用。
python - 从 numpy.ndarray 初始化 cython 中的 memoryview 切片
我正在尝试初始化内存视图的一个切片(不是整个)。假设我有 memoryviewA
作为类的属性(扩展类型)
现在,我试图在一个cdef
函数中初始化它。我像这样初始化整个内存视图没有问题
当初始化器B
是 3D 数组时这很好,(2,N,N)
这样我们就不必切片 A
了。但是现在,问题就在这里:假设我有 2D 数组B1
,B2
大小为 (N,N),并尝试初始化为
这给了我以下错误:
当然,我可以将所有数据从B1
和一个一个地复制B2
到A
,但这不会有效。这个过程是一个循环,而且规模N
很大。B1
并以类型B2
加载netcdf文件numpy.ndarray
。
另外,我将其定义A
为内存视图,以便在代码中的其他地方我可以使用nogil
函数而不是访问A
.
我想知道是否有一种有效的方法来如上所述初始化 memoryview,或者至少以某种方式使用 and 的指针B1
并将B2
它们放在一个可迭代的数组中。谢谢。
python - 我可以将字符串转换为内存视图吗?
所以我有 2 个通过 UDP 连接的程序。
发件人:
接收者:
你可以注意到我传递的是一个memoryview
对象,这是我想要接收的。但它不是那样工作的。我收到的是string
我想转换回memoryview
. 可能吗?
self.Data 是一个字节数组
python - Numpy 交织奇怪形状的数组
好的,这里给定的数据;形状有三个 numpy 数组:(i, 4, 2), (i, 4, 3), (i, 4, 2) i 在它们之间是共享的,但是是可变的。dtype 是 float32 的一切。目标是以特定顺序将它们交织在一起。让我们看看这些数组的索引 0 处的数据:
在这种情况下,连接的目标数组看起来像这样:
然后继续索引 1。
我不知道如何实现这一点,因为连接函数只是不断告诉我形状不匹配。目标数组的形状并不重要,只是它的内存视图必须按照给定的顺序上传到 gpu 着色器。
编辑:我可以用一些 python for 循环来实现这一点,但性能影响将是这个程序中的一个问题。
python - Python的memoryview底层机制
据说 Python 的 memoryview 在切片时不会复制数据。已经完成了许多基准测试,其中一些在stackoverflow上,“证明”了这种行为。
在试图惹恼他们时,我遇到了一个我无法解释的奇怪行为:
一方面,memoryview“不”复制数据。另一方面,这完全有效!
虽然我很高兴它“有效”,但我对它有效的事实感到难过。嗯......因为它不应该。
如果 Python 有 1 个字符的缓冲区,结果应该是这样的:
基本上,在写入第 5 个字符时,它应该已经重叠并读取了之前写入的第一个字符。这种天真的方法的一个例子:
我尝试将 memoryview 大小增加到大量,但它仍然有效,这意味着 python 在后台复制数据,使 memoryview 对象变得毫无意义。
这里有什么地方我错了吗?有什么解释吗?那么memoryview是如何工作的呢?
python - 提高高度重复的 numpy 数组索引操作的性能
在我的程序代码中,我有numpy
值数组和numpy
索引数组。两者都是在程序初始化期间预先分配和预定义的。
程序的每一部分都有一个values
用于计算的数组和三个索引数组idx_from_exch
,idx_values
和idx_to_exch
。有一个全局值数组来交换几个部分的值:exch_arr
.
大多数时候索引数组有 2 到 5 个索引,很少(很可能永远不会)需要更多索引。dtype=np.int32
,shape
并且值在整个程序运行期间是恒定的。因此我ndarray.flags.writeable=False
在初始化后设置,但这是可选的。索引数组的索引值idx_values
并按idx_to_exch
数字顺序排序,idx_source
可以排序,但没有办法定义它。与一个值数组/部分对应的所有索引数组都具有相同的shape
. 数组通常有 50 到 1000 个元素
。并且在整个程序运行期间是恒定的,数组的值在每次迭代中都会发生变化。
以下是示例数组:values
exch_arr
shape
dtype=np.float64
示例索引操作如下所示:
由于这些操作每次迭代都会应用一次,持续数百万次迭代,因此速度至关重要。在上一个问题中,我一直在研究提高索引速度的许多不同方法,但是考虑到我的应用程序(尤其是通过使用常量索引数组进行索引并将它们传递给另一个索引数组来获取值),我忘记了足够具体。
到目前为止,最好的方法似乎是花哨的索引。我目前也在尝试numba
guvectorize
,但似乎不值得付出努力,因为我的阵列很小。
memoryviews
会很好,但由于索引数组不一定有一致的步骤,我知道没有办法使用memoryviews
.
那么有没有更快的方法来进行重复索引?为每个索引操作预定义内存地址数组的某种方式,dtype
并且shape
始终保持不变?ndarray.__array_interface__
给了我一个内存地址,但我无法将它用于索引。我想到了类似的东西:
这可行吗?
我也一直在考虑strides
直接使用 with as_strided
,但据我所知,只允许一致的步幅,我的问题需要不一致strides
。
任何帮助表示赞赏!提前致谢!
编辑:
我刚刚纠正了我的示例计算中的一个巨大错误!
该操作values = values * 1.1
改变了数组的内存地址。我在程序代码中的所有操作都布置为不更改数组的内存地址,因为许多其他操作都依赖于使用 memoryviews。因此,我用正确的就地操作替换了虚拟操作:values *= 1.1
python - 哪个更快 np.vstack、np.append、np.concatenate 或 cython 中的手动功能?
我编写了一些程序,它numpy
在每次迭代中更新一个列表并对其进行一些操作。迭代次数取决于时间。例如在 1 秒内,可能有 1000 到 2500 次迭代。这意味着 numpy 列表中的项目对于运行程序 1 秒不会超过 2500。
我已经实现了一个基本算法,我不确定它是否是最快的计算方法bonus
:
我正在考虑使用这些想法加速这个程序:
- 使用
np.vstack
,np.stack
或者np.concatenate
代替np.append(pl_list, [pl_length])
. (哪一个可能更快?) 像这样使用自制函数计算np.std、np.mean(因为在内存视图中迭代在cython中非常快):
cdef int i,sm = 0
for i in range(pl_list.shape[0]):
sm += pl_list[i]
mean = sm/pl_list.shape[0]
我也在考虑为内存视图定义一个静态长度(比如 2500),所以我不需要使用
np.append
,我可以在那个 numpy 列表上构建一个队列结构。(队列库怎么样?在这种操作中这比 numpy 列表快吗?)
对不起,如果我的问题太多和复杂。我只是想在速度上获得最佳性能。
python - Python:我可以将内存视图或字节数组映射到 mmap
我正在编写一个相当简单的 python 程序来读取 mmap 区域,并且可能会修改该 mmap 区域中的一些字节,或者可能会获取其中一些字节的副本。
mmap 区域有几 MB 大,并分成 2048 字节大的帧。程序在该区域连续循环非常快,有时会进行复制,几乎所有时间都触及每个 2048 字节帧中的几个字节。
为了将对象创建所花费的时间限制到最少(即:仅在需要副本时创建对象),我想为每个 2048 字节帧创建一个指向内存的“某些对象”列表。
到目前为止,我已经设法使用 ctypes(2048 个字符的数组)来做到这一点,但我发现使用起来很麻烦。我想知道是否有一种方法可以从 mmap 对象创建内存视图或类似字节数组的对象,而不是创建内存的实际副本,而是该对象仅指向 mmap。
这是一些代码:
期待阅读任何答案,我被那个答案难住了。我一定遗漏了一些明显的东西,但是什么?
昨晚已经很晚了,所以请注意以下几点:似乎 memoryview 向我返回了 ctype 对象的地址,而不是 ctype 对象指向的内存区域。如果我在 map[:] 切片上运行 bytearray(),我会得到一个副本,如果我在切片上尝试 memoryview,它似乎坚持指向 mmap 的开始。(或至少:对于所有 4096 帧,它始终指向 mmap 区域中的同一位置-)。