代码之家  ›  专栏  ›  技术社区  ›  dabadaba

基于索引和条件更改了numpy数组中的值

  •  2
  • dabadaba  · 技术社区  · 6 年前

    我有一个numpy数组:

    arr = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]])
    
    >> arr
    [[ 1  2  3  4  5]
     [ 6  7  8  9 10]]
    

    我想根据索引(而不是切片)获取数组的一部分:

    ix = np.ix_([0, 1], [0, 2])
    >> arr[ix]
    
    [[1 3]
     [6 8]]
    

    我想修改原始数组中的那些元素,如果我这样做的话,这些元素会起作用:

    arr[ix] = 0
    >> arr
    [[ 0  2  0  4  5]
     [ 0  7  0  9 10]]
    

    但我只想改变他们,如果他们遵循一个特定的条件,如如果他们小于 5 . 我正在尝试:

    subarr = arr[ix]
    subarr[subarr < 5] = 0
    

    但它不会修改原来的。

    >> arr
    [[ 1  2  3  4  5]
     [ 6  7  8  9 10]]
    
    >> subarr
    [[0 0]
     [6 8]]
    

    我不知道为什么这不起作用,因为这两种方法都是通过索引访问数组 np.ix_ 用面具 subarr < 5

    2 回复  |  直到 6 年前
        1
  •  4
  •   jpp    6 年前

    花式索引返回一个副本;因此,将不会更新原始数组。你可以用 numpy.where 要更新值:

    arr[ix] = np.where(arr[ix] < 5, 0, arr[ix])
    
    array([[ 0,  2,  0,  4,  5],
           [ 6,  7,  8,  9, 10]])
    
        2
  •  0
  •   Colonel Beauvel    6 年前

    当您这样做时:

    arr[ix] = 0
    

    python解释器是这样做的 arr.__setitem__(ix, 0) 从而修改原始对象。

    关于第二个案子 subarr 独立于 arr ,这是一个 复制 然后修改这个副本。