【问题标题】:Modifying multidimensional numpy subarrays indexed by lists修改由列表索引的多维 numpy 子数组
【发布时间】:2013-03-23 06:31:33
【问题描述】:

假设我有一个 4x4 numpy 数组:quad = arange(16).reshape(4,4),即

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

我想用值改变元素,

[[ 5  7]
 [ 9 11]]

到(例如),

[[16 17]
 [18 19]]

我最初的猜测是我可以做类似的事情,

quad[[1,3],[1,3]] = np.arange(16,20).reshape(2,2)

但这不起作用,因为quad[[1,3],[1,3]] 实际上产生了对应于 [5,11] 的元素。我发现我可以使用quad[[1,3]][:,[1,3]]查看适当的元素,但我不能用它来修改这些值。

是使用for 循环的唯一解决方案吗?

【问题讨论】:

    标签: python arrays numpy indexing scipy


    【解决方案1】:

    你可以这样做:

    quad[np.ix_([1, 3], [1, 3])]
    

    这是以下的简写:

    x = [[1, 1], [3, 3]]
    y = [[1, 3], [1, 3]]
    quad[x, y]
    

    【讨论】:

      【解决方案2】:

      这是 Numpy 中 integer indexing 的行为。如果您将 N 维数组 A 的元组 (m_1...m_n) 作为 N 维数组的索引,其大小为 M,则切片构造为

      result[m_1, ..., m_n] == np.array([A[m_1[0], ..., m_n[0]], A[m_1[1], ..., m_n[1]],
                                 ..., A[m_1[M], ..., m_n[M]]]
      

      要克服这种行为,您可以使用切片索引两次:

      >>> a = np.arange(16).reshape(4,4)
      >>> a[1:3][:,1:3]
      array([[ 5,  6],
             [ 9, 10]])
      

      UPD:您可以修改此视图:

      >>> b = np.arange(16,20).reshape(2,2)
      >>> b
      array([[16, 17],
             [18, 19]])
      >>> a[1:3][:,1:3] = b
      >>> a
      array([[ 0,  1,  2,  3],
             [ 4, 16, 17,  7],
             [ 8, 18, 19, 11],
             [12, 13, 14, 15]])
      

      【讨论】:

      • 感谢您的回答!在您回答时,我稍微修改了我的问题,我很抱歉——我实际上需要修改给定的值,这种技术似乎不允许
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2019-01-04
      • 1970-01-01
      相关资源
      最近更新 更多