改变NumPy数组中不在一个索引列表中的值。

问题描述 投票:34回答:4

我有一个像NumPy这样的数组。

a = np.arange(30)

我知道我可以替换位于位置上的值。indices=[2,3,4] 例如,使用花式索引。

a[indices] = 999

但是,如何替换那些不存在于的位置上的值?indices? 会是像下面这样的东西吗?

a[ not in indices ] = 888
python arrays numpy replace multidimensional-array
4个回答
46
投票

我不知道有什么简单的方法可以做到这样。

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_ -- 在输出上不会有任何区别,这只是一个偏好的问题。


6
投票

只适用于1d数组。

a = np.arange(30)
indices = [2, 3, 4]

ia = np.indices(a.shape)

not_indices = np.setxor1d(ia, indices)
a[not_indices] = 888

4
投票

很明显,没有一个通用的 not 套数的运算符。你的选择是

  1. 减去你的 indices 从一个普遍的指数集中得到的集合(取决于以下形状 a),但这在实现和读取上会有些困难。
  2. 某种迭代(可能是 for-循环是你最好的选择,因为你肯定想使用你的索引是排序的这一事实)。)
  3. 创建一个充满新值的新数组,并有选择地复制旧数组中的索引。

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

4
投票

只是克服了类似的情况,用这种方法解决了。

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
© www.soinside.com 2019 - 2024. All rights reserved.