首页 > 解决方案 > 将值分配给由多个条件定义的数组的子集

问题描述

我想将值分配给由多个条件指定的数组的一部分。

例如:

    import numpy as np
    temp = np.arange(120).reshape((2,3,4,5))
    mask = temp > 22
    submask = temp[mask] < 43
    (temp[mask])[submask] = 0 # assign zeros to the part of the array specified via mask and submask
    print(temp) # notice that temp is unchanged - I want it to be changed

这个例子是人为的。一般来说,我想做一些更复杂的事情,包括索引和布尔掩码的组合。在类似情况下使用列表索引会失败。例如:temp[:,:,0,[1,3,2]]=0是一个有效的分配,但temp[:,:,0,[1,3,2]][mask]=0会失败。

我的理解是分配失败,因为复杂的索引提示 numpy 复制数组对象并分配给它,而不是原始数组。所以并不是分配本身失败,只是分配指向“错误”的对象。

我曾尝试使用诸如np.copytoand之类的函数,np.putmask但这些函数也失败了,大概是因为后端实现模仿了原始问题。例如:np.putmask(temp, mask, 0)会工作但np.putmask(temp[mask], submask, 0)不会。

有什么好方法可以做我想做的事吗?

标签: pythonpython-3.xnumpy

解决方案


推荐阅读