了解Numpy数据类型

时间:2017-11-14 21:45:42

标签: python numpy

在阅读PyCUDA文档时,我发现我不明白这段代码是如何工作的

numpy.getbuffer(numpy.intp(int(self.data)))

理论上它应该返回一个指向float的指针,而它接收self.data,这是一个指向浮点数组的指针。

我确信这个问题很简单,但在查看有关书籍中numpy.intp的更多信息后,我找不到任何有用的信息。

1 个答案:

答案 0 :(得分:0)

这是来源

https://documen.tician.de/pycuda/tutorial.html?highlight=getbuffer

class DoubleOpStruct:
    mem_size = 8 + numpy.intp(0).nbytes
    def __init__(self, array, struct_arr_ptr):
        self.data = cuda.to_device(array)
        self.shape, self.dtype = array.shape, array.dtype
        cuda.memcpy_htod(int(struct_arr_ptr), numpy.getbuffer(numpy.int32(array.size)))
        cuda.memcpy_htod(int(struct_arr_ptr) + 8, numpy.getbuffer(numpy.intp(int(self.data))))
    def __str__(self):
        return str(cuda.from_device(self.data, self.shape, self.dtype))

array1 = DoubleOpStruct(numpy.array([1, 2, 3], dtype=numpy.float32), struct_arr)
array2 = DoubleOpStruct(numpy.array([0, 4], dtype=numpy.float32), do2_ptr)
print("original arrays", array1, array2)

np.float32的课程输入中,cuda.to_device返回的内容并不明显。它不能是一个数组,否则int(self.data)将不起作用。 (与我第一次阅读你的问题self.data相反,它不是self的数据缓冲区。它可能是相关的,但它不是缓冲区对象)。

所以表达式必须是这样的:

>>> np.intp(2432353)
2432353
>>> np.getbuffer(np.intp(2432353))
<read-only buffer for 0xb74d1150, size -1, offset 0 at 0xb71dfba0>

>>> np.arange(4.).data
<read-write buffer for 0xb71dda98, size 32, offset 0 at 0xb71df1c0>

cuda.to_device可能会生成类似数据的数字&#39;价值__array_interface__

>>> np.arange(4.).__array_interface__['data']
(148454560, False)
>>> np.arange(4.).__array_interface__['data'][0]
148454560
>>> np.getbuffer(np.intp(int(_)))
<read-only buffer for 0xb74d1150, size -1, offset 0 at 0xb3a0c800>

(作为旁注,np.getbuffer的Py3版本中不存在numpy

无论如何,我在这里看不到任何数据类型游戏。