【发布时间】:2019-08-17 16:45:24
【问题描述】:
我有一个大小为 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共享内存。
【问题讨论】:
-
我不完全理解你的输出应该是什么样子,但是 numpy.unique() 对你有帮助吗?
-
您需要阅读更多关于如何定义和存储数组的基础知识,以及
view和copy之间的区别。view可以共享内存,因为它只是在shape、strides(和内存指针)方面有所不同。但是在indices的情况下共享内存需要将indices列表与c一起存储;实际上,每次访问c时都会重新执行索引操作。 -
数组的 dtype 是什么,即您要存储的元素的类型是什么?
-
@JohnZwinck dtype 是 numpy.int64。
-
@hpaulj 所以在索引的情况下是不可能的?