【问题标题】:Setting ndarray values with the flat iterator使用平面迭代器设置 ndarray 值
【发布时间】:2014-03-24 13:19:30
【问题描述】:

我试图理解为什么 ndarray 的平面迭代器会这样工作。假设A 是一个ndarray,形状为(N, N),比如说。

A.flat[::N + 1] = 1

A 的对角元素设置为值1。所以A.flat 以这种方式行动,就像A 上的视图一样。然而,令人惊讶的是,

A.flat[::N + 1][1:] = 1

不修改A(就像如果 A.flat 是一个视图那样)。

A.flat 是一个flatiter 对象,而不是A 的视图。这背后的原因是什么?是否可以将其实现为视图?

[据我了解,原始数组数据与有关该数据解释的信息分开存储——数组长度、数组尺寸、步幅、列顺序等。所以看起来扁平化可以通过设置适当的维度(和步幅,取决于列顺序)。]

【问题讨论】:

  • 如果您检查这两个中的.flags。你可以看到第二个不拥有它自己的数据。

标签: python numpy


【解决方案1】:

在 python 中,A[a][b] = B 大致翻译为:

tmp = A[a]
tmp[b] = B

这适用于python对象,即列表列表或dict列表,但对于numpy数组来说是有问题的。当A[a]A 的视图时,它适用于numpy 数组,但在A[a] 是副本时不起作用。 This page 将告诉您更多关于索引 numpy 数组何时返回视图以及何时返回副本的信息。我相信索引flat 属性总是返回一个副本。话虽如此,当您使用 numpy 数组时,我会避免在左侧使用两组 [] =

更新: 您的问题的答案是“是否可以将 [平面属性] 实现为视图?”没有。 Numpy 数组支持任意步幅,并且对于许多步幅组合,不可能创建平面数组的一维视图。如果可能,ravel 方法将返回一个数组的视图。当无法将数组展平为视图时,它将返回一个副本。我想如果你确定你的数组可以用一个视图展平,你可以这样做:

A.ravel()[::N + 1][1:] = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2013-11-24
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多