【问题标题】:How to create a numpy array of views to other numpy arrays如何为其他 numpy 数组创建一个 numpy 视图数组
【发布时间】: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 仅适用于数组可以共享底层数据缓冲区 - 即访问与原始数据相同的数据,但具有不同的形状和步幅。通常这是一个子集,但绝不是多个数据缓冲区的任何类型的超集。

标签: python numpy


【解决方案1】:

一种解决方案是堆栈()或连接()某些尺寸匹配的数组。 如果尺寸不匹配 - 使用填充,将尺寸存储在单独的列表中,然后堆叠。

【讨论】:

  • 这些方法确实以我正在寻找的方式组合数组,但经过一些测试,似乎他们通过制作副本来做到这一点,即在组合它们之后,更改单个数组不会影响组合数组。我想知道是否存在 stack 或 concatenate 组合引用或视图对象而不是数组的新副本。
  • 有 numpy object dtype,但我认为这是一个混蛋列表。它最常被错误地创建,如np.array([[1,2,3], [4,5]])。它的数学命中或未命中,比在常规数值数组上慢,迭代比在列表上慢。
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多