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

将常量添加到数组的切片

  •  1
  • mins  · 技术社区  · 1 年前

    试图对数组的一个切片进行变异,将一个常量添加到具有奇数索引的元素中。但这必须是一个副本,而不是指定的原始数组,因为这不会更改数组:

    times = np.arange(10)
    times[1::2] = times[1::2] + 0.5
    

    这很奇怪,因为它起作用:

    times[1::2] = -1
    

    为什么切片是副本? 如何使其按预期工作?

    2 回复  |  直到 1 年前
        1
  •  3
  •   RomanPerekhrest    1 年前

    使用附加分配(具有类型协议):

    a = np.arange(10).astype(float)
    a[1::2] += 0.5
    

    array([0. , 1.5, 2. , 3.5, 4. , 5.5, 6. , 7.5, 8. , 9.5])
    
        2
  •  2
  •   Learning is a mess    1 年前

    原因是添加 0.5 将dtype从int更改为float,当您尝试将其复制回切片时 times[1::2] numpy将解决的lhs和rhs之间的dtype不兼容问题 times[1::2] = times[1::2] + 0.5 通过将切片变成副本而不是视图。

    检查

    times = np.arange(10, dtype=float)
    times[1::2] = times[1::2] + 0.5
    #times = array([0. , 1.5, 2. , 3.5, 4. , 5.5, 6. , 7.5, 8. , 9.5])
    

    将初始数组强制转换为float将导致dtype不匹配,numpy现在将切片到视图中,更改将传播回 times

    看见 https://numpy.org/doc/stable/user/basics.copies.html 了解详细信息