将现有的NumPy数组转换为ctype数组以在多处理之间共享

时间:2019-05-18 21:57:43

标签: python arrays numpy multiprocessing ctypes

假设我有一个现有数组,我们不想对其进行任何更改,但是喜欢转换为ctype数组并稍后在所有多处理过程中共享。

我要共享的实际数组的形状为120,000 x 4,太大了,无法在此处键入所有内容,因此,让我们假设这样的数组较小,看起来像这样:

import numpy as np
import multiprocessing as mp
import ctypes

array_from_data = np.array([[275,174,190],
                          [494, 2292, 9103],
                          [10389,284,28],
                          [193,746,293]])

我已经阅读了其他讨论ctype数组和多处理的文章,例如this one。但是,答案与我要寻找的答案并不完全相同,因为到目前为止,它们与转换现有的NumPy数组并不完全相同。

我的问题如下:

1)如何从Numpy数组简单转换为ctype数组?

2)如何使数组以一种简单的方式在所有多处理之间共享?

谢谢。

编辑:实际数组上的拼写和一些说明

EDIT2:显然,操作系统本身会影响多处理的行为,因此我需要指定它:我的操作系统是Windows 10 64位。

1 个答案:

答案 0 :(得分:0)

我几个月前发现的解决方法要求首先将数组扁平化为一维数组,即使我只了解底层的一半。

解决方案的要旨是:

1)制作与我们要共享的数组相同大小和相同dtypes的RawArray

2)创建一个使用与RawArray相同的内存位置的numpy数组

3)将元素填充到新创建的numpy数组

解决方法:

import ctypes
import multiprocessing as mp

import numpy as np


array_from_data = np.array([[275,174,190],
                          [494, 2292, 9103],
                          [10389,284,28],
                          [193,746,293]])

flattened_array1 = array_from_data.flatten(order='C')
flattened_array2 = np.array([1,0,1,0,1]).astype(bool)
flattened_array3 = np.array([1,0,1,0,-10]).astype(np.float32)

array_shared_in_multiprocessing1 = mp.RawArray(ctypes.c_int32,len(flattened_array1))
temp1 = np.frombuffer(array_shared_in_multiprocessing1, dtype=np.int32)
temp1[:] = flattened_array1

array_shared_in_multiprocessing2 = mp.RawArray(ctypes.c_bool,len(flattened_array2))
temp2 = np.frombuffer(array_shared_in_multiprocessing2, dtype=bool)
temp2[:] = flattened_array2

array_shared_in_multiprocessing3 = mp.RawArray(ctypes.c_float,len(flattened_array3))
temp2 = np.frombuffer(array_shared_in_multiprocessing3, dtype=np.float32)
temp2[:] = flattened_array3