三角矩阵numpy的累积和

问题描述 投票:1回答:1

说我有以下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值?我想避免在我的较小数组的末尾添加零(我的真实数组可能包含零,这对我来说不同于根本没有值)。

arrays numpy matrix cumsum
1个回答
3
投票

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

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

你得到了一种array([object, object, object])的一维数组。这里没有矩阵结构,没有轴可以交换,没有ufuncs可以应用,真的没有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是一个诚实的float-datatype NumPy数组,你可以应用cumsum或其他什么。

b.cumsum(axis=1)

回报

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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.