三角矩阵numpy的累积和
Cumulative sum of triangular matrix numpy
假设我有以下 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.]])
有什么方法可以对三角形做同样的事情吗array/matrix?
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
值?我想避免在较小的数组末尾添加零(我的真实数组可能包含零,对我来说这与根本没有值不同)。
这个问题是基于错误的前提。 NumPy 中没有三角数组这样的东西,所以问如何求 1 的累加是没有意义的。如果你写
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)
returns
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
假设我有以下 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.]])
有什么方法可以对三角形做同样的事情吗array/matrix?
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
值?我想避免在较小的数组末尾添加零(我的真实数组可能包含零,对我来说这与根本没有值不同)。
这个问题是基于错误的前提。 NumPy 中没有三角数组这样的东西,所以问如何求 1 的累加是没有意义的。如果你写
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)
returns
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