Python 更改不在索引列表中的NumPy数组的值

Python 更改不在索引列表中的NumPy数组的值,python,arrays,numpy,replace,multidimensional-array,Python,Arrays,Numpy,Replace,Multidimensional Array,我有一个NumPy数组,如: a = np.arange(30) 我知道我可以替换位于位置索引=[2,3,4]的值,例如使用花式索引: a[indices] = 999 但是如何替换不在索引中的位置的值呢?会像下面这样吗 a[ not in indices ] = 888 显然,集合没有通用的not运算符。你的选择是: 从一组通用索引中减去索引集(取决于a的形状),但这将有点难以实现和读取 某种迭代(可能for-循环是您的最佳选择,因为您肯定希望使用索引已排序的事实) 创建一个充满新值的新

我有一个NumPy数组,如:

a = np.arange(30)
我知道我可以替换位于位置
索引=[2,3,4]
的值,例如使用花式索引:

a[indices] = 999
但是如何替换不在
索引中的位置的值呢?会像下面这样吗

a[ not in indices ] = 888

显然,集合没有通用的
not
运算符。你的选择是:

  • 从一组通用索引中减去
    索引
    集(取决于
    a
    的形状),但这将有点难以实现和读取
  • 某种迭代(可能
    for
    -循环是您的最佳选择,因为您肯定希望使用索引已排序的事实)
  • 创建一个充满新值的新数组,并有选择地从旧数组复制索引

    b = np.repeat(888, a.shape)
    b[indices] = a[indices]
    

  • 我不知道有什么干净的方法可以做这样的事情:

    mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool)
    mask[indices] = False
    a[~mask] = 999
    a[mask] = 888
    

    当然,如果您更喜欢使用numpy数据类型,那么可以使用
    dtype=np.bool\uu
    ——输出中不会有任何差异。这实际上只是偏好的问题。

    仅适用于1d阵列:

    a = np.arange(30)
    indices = [2, 3, 4]
    
    ia = np.indices(a.shape)
    
    not_indices = np.setxor1d(ia, indices)
    a[not_indices] = 888
    

    只要克服类似情况,就可以这样解决:

    a = np.arange(30)
    indices=[2,3,4]
    
    a[indices] = 999
    
    not_in_indices = [x for x in range(len(a)) if x not in indices]
    
    a[not_in_indices] = 888
    

    为什么不使用
    np.\u like
    在旁注中,您可以用对
    numpy.where
    的一次调用来替换最后几行(这是它真正有用的主要情况)。例如,
    a=np.where(mask,888999)
    @JoeKington——是的,这对这种情况更好。(但它确实分配了一个新数组)——我只是想演示一下,可以使用
    ~
    运算符对掩码变量求反。@mgilson-这一点很好!这是很多人不知道的事情,你的例子很好地说明了这一点。@JoeKington——我想
    a[…]=np.where(mask,888999)
    可能会在适当的地方覆盖
    a
    ,这演示了很多人不知道的省略号操作符:)这是低效的(对于只有几十万个条目的数据集来说,这很重要)。