python - 如何在 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共享内存。
解决方案
因此,使用一小组唯一值创建一个随机数组:
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]))
原始元素中的每个元素的反向映射都有一个值。
推荐阅读
- angular-cli - 使用 ng serve --host xxxx 不起作用
- sql - 从 PostgreSQL 中的 jsonb 获取特定对象时出错
- java - 如何使用 JTable 鼠标单击事件将 JTable 的图像显示到 JLabel 或从数据库到 JLabel?
- arrays - 为什么 Perl 排序函数不能以我预期的增量方式排列数组的元素?
- instagram - 获取别人的 Instagram 故事
- javascript - 用硒填写位于新页面中的表格
- sql - 将结果设置为新列中超过一百万行的数组-postgreSQL
- python - Django 不在开发中提供静态和媒体文件,而是在生产中提供服务
- go - 使用路径风格的亚马逊 aws sdk go
- ios - 调用函数切换到另一个ViewController时,应用程序崩溃