python - Numpy:条件总和
问题描述
我有以下 numpy 数组:
import numpy as np
arr = np.array([[1,2,3,4,2000],
[5,6,7,8,2000],
[9,0,1,2,2001],
[3,4,5,6,2001],
[7,8,9,0,2002],
[1,2,3,4,2002],
[5,6,7,8,2003],
[9,0,1,2,2003]
])
我理解np.sum(arr, axis=0)
提供结果:
array([ 40, 28, 36, 34, 16012])
我想做的(没有for循环)是根据最后一列的值对列求和,以便提供的结果是:
array([[ 6, 8, 10, 12, 4000],
[ 12, 4, 6, 8, 4002],
[ 8, 10, 12, 4, 4004],
[ 14, 6, 8, 10, 4006]])
我意识到没有循环可能会很费力,但希望最好......
如果必须使用 for 循环,那将如何工作?
我试过np.sum(arr[:, 4]==2000, axis=0)
(我会2000
用 for 循环中的变量替换),但是它给出了结果2
解决方案
np.diff
您可以使用和的巧妙应用在纯 numpy 中执行此操作np.add.reduceat
。np.diff
将为您提供最右侧列更改的索引:
d = np.diff(arr[:, -1])
np.where
会将您的布尔索引转换为期望d
的整数索引:np.add.reduceat
d = np.where(d)[0]
reduceat
还将期望看到零索引,并且所有内容都需要移动一:
indices = np.r_[0, e + 1]
在这里使用np.r_
比np.concatenate
因为它允许标量更方便。然后总和变为:
result = np.add.reduceat(arr, indices, axis=0)
当然,这可以组合成一条线:
>>> result = np.add.reduceat(arr, np.r_[0, np.where(np.diff(arr[:, -1]))[0] + 1], axis=0)
>>> result
array([[ 6, 8, 10, 12, 4000],
[ 12, 4, 6, 8, 4002],
[ 8, 10, 12, 4, 4004],
[ 14, 6, 8, 10, 4006]])
推荐阅读
- pandas - 按类别着色 - plotly scattermapbox
- react-native - 如何将 Redux 与 createSwitchNavigator 一起使用?
- ruby-on-rails - Rails循环中断不断循环
- node.js - Cassandra 循环读取
- uwsgi - 让多个 uWSGI 工作者的一个实例执行一项额外的功能
- spring-mvc - Thymeleaf + Spring:如何在模板文件中写入“[]”?
- javascript - node.js 将 xml 转换为 json
- c# - 如何将图像文件存储在文件夹mvc中
- angularjs - 在 es6 模块中导入时未注册 AngularJs 控制器
- javascript - 只为所有人显示一个工具提示。Highstock highcharts