假设我有一个现有数组,我们不想对其进行任何更改,但是喜欢转换为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位。
答案 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