根据其指标对数组的相同元素求和

时间:2015-07-26 14:10:14

标签: python numpy

如何根据指数从数组中总结所有2的优雅解决方案? 我有这个数组x = [2 2 2 3 2 2 2 2 3 3 2 3 2 2 3 3 2]

然后我找到了他们的职位

y = where(isclose(x,2)) 

并获取另一个类似y = (array([ 0, 1, 2, 4, 5, 6, 7, 10, 12, 13, 16])

的数组

那么我如何使用numpy根据x中的索引计算y中元素的总和。

3 个答案:

答案 0 :(得分:0)

您只需使用简单的indexing获取相应的项目,然后使用np.sum

>>> np.sum(x[np.where(x==2)[0]]) 
22

另请注意,在alclose np.where中您不需要x=2,您只需使用public function search($params) { $query = Items::find(); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); $dataProvider->setSort([ 'defaultOrder' => ['position' => SORT_ASC], 'attributes' => [ 'position' => [ 'asc' => ['items.is_top'=>SORT_ASC,'items.position' => SORT_DESC], 'label' => 'By popularity', ], 'pricerup' => [ 'asc' => ['prices.price' => SORT_ASC], 'label' => 'Exprensive to cheap' ], 'pricerdown' => [ 'asc' => ['prices.price' => SORT_DESC], 'label' => 'Cheap to expensive' ], ] ]); if (!($this->load($params) && $this->validate())) { $query->joinWith(['prices']); return $dataProvider; } $query->andFilterWhere([ 'discount' => $this->discount, 'present_id' => $this->present_id, 'is_top' => $this->is_top, 'manufacturer_id' => $this->manufacturer_id, ]); $query->andFilterWhere(['like', 'name', $this->name]) ->andFilterWhere(['like', 'description', $this->description]) ->andFilterWhere(['like', 'taste', $this->taste]) ->andFilterWhere(['like', 'country', $this->country]) ->andFilterWhere(['like', 'slug', $this->slug]) ->andFilterWhere(['like', 'short_desc', $this->short_desc]) ->andFilterWhere(['like', 'thumbnail', $this->thumbnail]); return $dataProvider; } 。正如评论中所述,这不是执行此任务的正确方法,如果这是唯一的问题。

答案 1 :(得分:0)

你不需要使用np.where - 一个布尔数组,如np.isclose返回的布尔值或各种比较运算符,作为另一个数组的索引(提供)大小匹配)。这意味着您可以获得以下所有内容:

>>> x[np.isclose(x, 2)]
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

直接总结:

>>> x[np.isclose(x, 2)].sum()
22

答案 2 :(得分:0)

如果x仅包含非负的整数,则可以使用

对每个值的出现次数求和
total = np.bincount(x, weights=x)
# array([  0.,   0.,  22.,  18.])

total[2]的值为22,因为x中有11个。 由于total[3]中有3个三个,因此x的值为18。