Python 更改不在索引列表中的NumPy数组的值
我有一个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-循环是您的最佳选择,因为您肯定希望使用索引已排序的事实) 创建一个充满新值的新
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
,这演示了很多人不知道的省略号操作符:)这是低效的(对于只有几十万个条目的数据集来说,这很重要)。