通过C API创建新的numpy标量并实现自定义vi

2024-05-14 07:57:22 发布

您现在位置:Python中文网/ 问答频道 /正文

短版

给定一个内置的四元数数据类型,如何将四元数的numpy数组看作一个额外维度为4的浮点数组(而不复制内存)?在

长版

Numpy内置了对浮动和复杂浮动的支持。我需要使用quaternions——它概括了复数,但是它们没有两个分量,而是有四个分量。已经有了使用C API将四元数直接合并到numpy中的a very nice package,它似乎可以非常快速地完成所有操作。还有一些四元数函数I need to add to it,但我想我基本上可以处理这些。在

不过,我也希望能够在其他需要使用awesome ^{}包编写的函数中使用这些四元数。不幸的是,numba目前无法处理自定义类型。但我不需要那些麻木的函数中的花哨的四元数函数;我只需要数字本身。所以我希望能够将四元数数组重新转换为一个额外维度的浮点数组(大小为4)。特别是,我希望只使用数组中已经存在的数据而不进行复制,并将其作为新数组查看。我找到了PyArray_View函数,但不知道如何实现它。在

(我很有信心这些数据是连续存储在内存中的,我想这是简单查看它们所必需的。具体来说,^{} and ^{} in the quaternion package。)


Tags: to数据函数内存numpyapipackage数组
1条回答
网友
1楼 · 发布于 2024-05-14 07:57:22

结果很简单。numpy的魔力意味着它已经成为可能。考虑到这一点,我尝试了以下复数:

import numpy as np
a = np.array([1+2j, 3+4j, 5+6j])
a.view(np.float).reshape(a.shape[0],2)

这正是我想要的。在某种程度上,同样的基本思想也适用于四元数类型。我想内部结构仅仅依赖于elsize,除以sizeof(float),然后用它来设置最后一个维度中的新大小???在

为了回答我自己的问题,同样的想法也适用于四元数模块:

^{pr2}$

在我的笔记本电脑上,视图转换和重塑组合起来似乎需要1微秒的时间,这与输入数组的大小无关(大概是因为除了一些基本python对象中的几个成员外,没有内存复制)。在

上述方法适用于简单的一维四元数数组。要将其应用于常规形状,我只需在四元数名称空间中编写一个函数:

def as_float_array(a):
    "View the quaternion array as an array of floats with one extra dimension of size 4"
    return a.view(np.float).reshape(a.shape+(4,))

不同的形状似乎不会显著降低功能。在

此外,很容易将浮点数组转换回四元数数组:

^{4}$

相关问题 更多 >

    热门问题