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

Convert an existing NumPy array into a ctype array to be shared among multiprocessing

假设我有一个现有的数组,我们不想对其进行任何更改,但希望将其转换为 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 数组和多处理的 posts,比如 this one。然而,答案与我正在寻找的并不完全相同,因为到目前为止,它们并不完全是关于转换现有的 NumPy 数组。

我的问题如下:

1) 如何简单地将现有的 Numpy 数组转换为 ctype 数组?

2) 如何以简单的方式使数组在所有多进程之间共享?

提前致谢。

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

EDIT2:显然 os 本身会影响多处理的行为方式,我需要指定它:我的 os 是 Windows 10 64 位。

我几个月前发现的解决方法需要先将数组展平为一维数组,尽管我只了解引擎盖下的一半内容。

解决方案的要点是:

1) 创建一个与我们尝试共享的数组具有相同大小和相同数据类型的 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