【发布时间】:2020-01-22 15:12:01
【问题描述】:
我有一个包含 numpy 数组作为属性的对象的大列表。它们每个都有操作数组的方法。我想创建一个 2D numpy 数组来存储其他数组并在操作单个 numpy 数组时进行更新。
这很容易通过列表实现,因为您只需要创建一个对其他列表的引用列表。
>>> x = [1,2,3]
>>> y = [4,5,6]
>>> z = [x,y] # stores reference to x and y
>>> x[0] = 10
>>> z
[[10,2,3],[4,5,6]]
但是,在 numpy 中执行相同操作会创建对象的副本。
>>> x = np.array([1,2,3])
>>> y = np.array([4,5,6])
>>> z = np.array([x,y]) # setting the optional argument copy = False didn't help either
>>> id(x)
140673084678272
>>> id(z[0])
140673084678512
我猜想设置 copy = False 不会起作用,因为我正在传递一个以前不存在的新连接列表对象。有没有办法创建z,它的元素是对numpy数组x和y的引用?
我认识到 numpy 中的引用通常使用 views 完成,但这似乎是一个不同的用例。创建单个 numpy 数组的视图对象相当简单,但我不确定如何将来自 N 个单独 numpy 数组的 N 个视图对象存储在一个 numpy 数组中。
【问题讨论】:
-
这些数组的列表有什么问题?
-
操作数组的方法需要一个 numpy 数组,而我将在串联数组上使用的最后一个方法需要一个 numpy 数组。
-
您可以创建新数组,然后对各个行进行“查看”(丢弃或忽略原件)。
-
A
view仅适用于数组可以共享底层数据缓冲区 - 即访问与原始数据相同的数据,但具有不同的形状和步幅。通常这是一个子集,但绝不是多个数据缓冲区的任何类型的超集。