【问题标题】:Cumulative sum of triangular matrix numpy三角矩阵numpy的累积和
【发布时间】:2017-12-20 19:54:05
【问题描述】:

假设我有以下numpy array

a = np.array([[1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [1.0, 2.0, 3.0]])

我想要这样的累积和数组:

a.cumsum(axis=1)
array([[ 1.,  3.,  6.],
       [ 1.,  3.,  6.],
       [ 1.,  3.,  6.]])

有没有办法对三角数组/矩阵做同样的事情?

b = np.array([[1.0, 2.0, 3.0], [2.0, 3.0], [3.0]])

基本上如下结果:

array([[1.0, 2.0, 3.0], [2.0, 5.0], [3.0]], dtype=object)

我尝试了以下方法,但收到以下错误消息:

b.cumsum(axis=1)

Traceback (most recent call last):
  File "C:\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-76-831556b68f3f>", line 1, in <module>
    b.cumsum(axis=1)
ValueError: axis(=1) out of bounds

我是否应该尝试重新定义 b 以获得 nan 值?我想避免在较小数组的末尾添加零(我的真实数组可能包含零,这对我来说与根本没有值不同)。

【问题讨论】:

  • 我认为这个词是“参差不齐的数组/矩阵”。因此,您可以简单地循环遍历每个元素并应用 cumsum。后续问题 - 你是如何得到这样一个数组/矩阵的?
  • 替代建议,如果您从 a 获取 b - 使用 np.triu(a).cumsum(1),然后删除每行的前导零,可能使用另一个 triu 掩码,具体取决于最终预期的 o/p。
  • 如果您想以经济的方式存储三角形数组,请使用 LAPACK 标准。这只是在使用 object 数据类型浪费大量性能

标签: arrays numpy matrix cumsum


【解决方案1】:

这个问题是基于错误的前提。 NumPy 中没有三角数组这样的东西,所以问如何找到一个累积的一些是没有意义的。如果你写

b = np.array([[1.0, 2.0, 3.0], [2.0, 3.0], [3.0]]) 

你会得到一个array([object, object, object]) 类型的一维数组。这里没有矩阵结构,没有要交换的轴,没有要应用的 ufunc,实际上与 NumPy 无关。只是一堆碰巧是 Python 列表的 Python 对象(它们不是 NumPy 数组)。

用 NaN 表示缺失值是很常见的事情。

row_list = [[1.0, 2.0, 3.0], [2.0, 3.0], [3.0]]
max_length = max([len(row) for row in row_list])
b = np.array([row + [np.nan]*(max_length - len(row)) for row in row_list])

现在b 是一个诚实的浮点数据类型 NumPy 数组,您可以对其应用 cumsum 或其他任何东西。

b.cumsum(axis=1)

返回

array([[  1.,   3.,   6.],
       [  2.,   5.,  nan],
       [  3.,  nan,  nan]])

masked array 模块可用于此类更复杂的事情,但 NaN 填充适用于不规则矩阵上的基本操作。其他一些可以做的事情:

np.nansum(b, axis=1)    # sum, ignoring NaN 
np.nanmean(b, axis=1)   # mean, ignoring NaN
np.isnan(b)             # find where NaN are in the array

【讨论】:

  • 我明白你的意思,非常感谢你的澄清!
猜你喜欢
  • 2012-11-11
  • 2015-03-31
  • 1970-01-01
  • 2017-12-19
  • 2011-08-27
  • 1970-01-01
  • 2011-06-16
  • 2019-10-08
  • 1970-01-01
相关资源
最近更新 更多