首页 > 解决方案 > 如何在 numpy 数组之间共享内存?

问题描述

我有一个大小为 100x100 的大型 numpy 数组。在这 10000 个值中,只有大约 50 个唯一值。所以我想创建第二个长度为 50 的数组,包含这些唯一值,然后以某种方式将大数组映射到较小的数组。实际上,我只想在我的系统中存储 50 个值,而不是冗余的 10000 个值。

数组切片似乎共享内存,但是一旦我使用特定的索引,内存共享就会丢失。

a = np.array([1,2,3,4,5])
b = a[:3]
indices = [0,1,2]
c = a[indices]
print(b,c)
print(np.shares_memory(a,b),np.shares_memory(a,c))

这给出了输出:

[1 2 3] [1 2 3]
True False

即使 b 和 c 引用相同的 a 值,b(切片)与 a 共享内存,而 c 不共享。如果我执行 b[0] = 100,a[0] 也变为 100,因为它们共享内存。c 的情况并非如此。

我想让c,它是所有来自a的值的集合,与a共享内存。

标签: pythonnumpymemory

解决方案


因此,使用一小组唯一值创建一个随机数组:

In [45]: x = np.random.randint(0,10,(10,10))                                                                 
In [46]: x                                                                                                   
Out[46]: 
array([[4, 3, 8, 5, 4, 8, 8, 1, 8, 1],
       [9, 2, 7, 2, 9, 5, 3, 9, 3, 3],
       [6, 2, 6, 9, 4, 2, 3, 4, 6, 7],
       [1, 0, 2, 1, 0, 9, 4, 2, 6, 2],
       [8, 1, 6, 8, 3, 9, 5, 0, 8, 5],
       [4, 9, 1, 4, 1, 2, 8, 4, 7, 2],
       [4, 5, 2, 4, 8, 0, 1, 4, 4, 7],
       [2, 2, 0, 5, 3, 0, 3, 3, 3, 9],
       [3, 1, 0, 6, 4, 8, 8, 3, 5, 2],
       [7, 5, 9, 2, 8, 0, 8, 1, 7, 8]])

找到独特的:

In [48]: np.unique(x)                                                                                        
Out[48]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

更好的是唯一值加上一个数组,让我们将这些值映射到原始值:

In [49]: np.unique(x, return_inverse=True)                                                                   
Out[49]: 
(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([4, 3, 8, 5, 4, 8, 8, 1, 8, 1, 9, 2, 7, 2, 9, 5, 3, 9, 3, 3, 6, 2,
        6, 9, 4, 2, 3, 4, 6, 7, 1, 0, 2, 1, 0, 9, 4, 2, 6, 2, 8, 1, 6, 8,
        3, 9, 5, 0, 8, 5, 4, 9, 1, 4, 1, 2, 8, 4, 7, 2, 4, 5, 2, 4, 8, 0,
        1, 4, 4, 7, 2, 2, 0, 5, 3, 0, 3, 3, 3, 9, 3, 1, 0, 6, 4, 8, 8, 3,
        5, 2, 7, 5, 9, 2, 8, 0, 8, 1, 7, 8]))

原始元素中的每个元素的反向映射都有一个值。


推荐阅读