将现有的 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
假设我有一个现有的数组,我们不想对其进行任何更改,但希望将其转换为 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