如何根据指数从数组中总结所有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
中元素的总和。
答案 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。