是否可以在不知道对象索引的情况下从numpy数组中删除对象,而是知道对象本身?
我已经看到可以使用np.delete函数使用对象的索引,但我正在寻找一种方法来使用对象但不是它的索引
示例:
[A,B,C,d,E,F]
x = e
我想删除x
事先提前答案 0 :(得分:23)
答案 1 :(得分:10)
将它投射为一个numpy数组,并且有一个非常简单的方法:
private static $db = array(
'Path' => 'Varchar(50)',
);
private static $allowed_actions = array (
'update',
);
public function updateCMSFields(FieldList $fields)
{
$fields->addFieldsToTab('Root.Importer', array(
ImporterPathField::create('Path', 'Path')->setDescription('Path to area'),
FormAction::create('update', 'Synchronise')
));
}
public function update() {
SS_Log::add_writer(new SS_LogEmailWriter('test@example.com'), SS_Log::ERR);
}
不一定比这更复杂。
答案 2 :(得分:4)
布尔索引或屏蔽是选择或删除数组的特定元素的一种很好的基本方法
您谈论删除特定对象'。让我们从字面上理解并定义一个dtype对象数组:
In [2]: x=np.array(['a','b','c','d','e'],dtype=object)
In [3]: x
Out[3]: array(['a', 'b', 'c', 'd', 'e'], dtype=object)
In [4]: x=='d' # elements that equal 'd'
Out[4]: array([False, False, False, True, False], dtype=bool)
In [5]: x!='d' # elements that don't
Out[5]: array([ True, True, True, False, True], dtype=bool)
In [6]: x[x!='d'] # select a subset
Out[6]: array(['a', 'b', 'c', 'e'], dtype=object)
幕后argwhere
和delete
使用此功能。请注意,argwhere
使用x==d
布尔数组,将其转换为数组索引。像这样构建掩码是delete
操作的一种方式。
有一些重要的限制:
平等(或非平等)测试必须适用于您的值。如果元素是浮点数,则可能不会。
从1d数组中删除比从2d(或更大)数组中删除更容易。使用2d时,您必须决定是删除行,列还是元素(并在此过程中展平数组)。
只删除那些匹配的一个元素有点棘手。
对于某些情况,.tolist()
数组可能更好,并使用list方法。
In [32]: xl=x.tolist()
In [33]: xl.remove('d')
In [34]: np.array(xl,dtype=object)
Out[34]: array(['a', 'b', 'c', 'e'], dtype=object)
对于数组,没有完全等同于list.remove
。
答案 3 :(得分:0)
arr = np.array(['a','b','c','d','e','f'])
然后
arr = [x for x in arr if arr != 'e']
答案 4 :(得分:0)
您可以使用np.setdiff1d(a,b),它会返回a中不在b中的所有 unique 元素。
>>> arr = np.array(['a', 'a', 'b', 'c', 'd', 'e', 'f'])
>>> to_remove = ['b', 'c']
>>> np.setdiff1d(arr, to_remove)
array(['a', 'd', 'e', 'f'], dtype='<U1')