计算拆分列表中不同长度矩阵的均值、方差、协方差
Calculate mean, variance, covariance of different length matrices in a split list
我有一个包含 5 个值的数组,由 4 个值和一个索引组成。我沿着索引对数组进行排序和拆分。这导致我分裂了不同长度的矩阵。从这里开始,我想计算每个拆分的第四个值的均值、方差和前三个值的协方差。我当前的方法使用 for 循环,我想用矩阵运算替换它,但我正在为不同大小的矩阵而苦苦挣扎。
import numpy as np
A = np.random.rand(10,5)
A[:,-1] = np.random.randint(4, size=10)
sorted_A = A[np.argsort(A[:,4])]
splits = np.split(sorted_A, np.where(np.diff(sorted_A[:,4]))[0]+1)
我当前的 for 循环如下所示:
result = np.zeros((len(splits), 5))
for idx, values in enumerate(splits):
if(len(values))>0:
result[idx, 0] = np.mean(values[:,3])
result[idx, 1] = np.var(values[:,3])
result[idx, 2:5] = np.cov(values[:,0:3].transpose(), ddof=0).diagonal()
else:
result[idx, 0] = values[:,3]
我尝试使用屏蔽数组但没有成功,因为我无法以正确的形式将矩阵加载到屏蔽数组中。也许有人知道该怎么做或有不同的建议。
您可以按如下方式使用np.add.reduceat
:
>>> idx = np.concatenate([[0], np.where(np.diff(sorted_A[:,4]))[0]+1, [A.shape[0]]])
>>> result2 = np.empty((idx.size-1, 5))
>>> result2[:, 0] = np.add.reduceat(sorted_A[:, 3], idx[:-1]) / np.diff(idx)
>>> result2[:, 1] = np.add.reduceat(sorted_A[:, 3]**2, idx[:-1]) / np.diff(idx) - result2[:, 0]**2
>>> result2[:, 2:5] = np.add.reduceat(sorted_A[:, :3]**2, idx[:-1], axis=0) / np.diff(idx)[:, None]
>>> result2[:, 2:5] -= (np.add.reduceat(sorted_A[:, :3], idx[:-1], axis=0) / np.diff(idx)[:, None])**2
>>>
>>> np.allclose(result, result2)
True
注意,协方差矩阵的对角线只是方差,它大大简化了这个向量化。
我有一个包含 5 个值的数组,由 4 个值和一个索引组成。我沿着索引对数组进行排序和拆分。这导致我分裂了不同长度的矩阵。从这里开始,我想计算每个拆分的第四个值的均值、方差和前三个值的协方差。我当前的方法使用 for 循环,我想用矩阵运算替换它,但我正在为不同大小的矩阵而苦苦挣扎。
import numpy as np
A = np.random.rand(10,5)
A[:,-1] = np.random.randint(4, size=10)
sorted_A = A[np.argsort(A[:,4])]
splits = np.split(sorted_A, np.where(np.diff(sorted_A[:,4]))[0]+1)
我当前的 for 循环如下所示:
result = np.zeros((len(splits), 5))
for idx, values in enumerate(splits):
if(len(values))>0:
result[idx, 0] = np.mean(values[:,3])
result[idx, 1] = np.var(values[:,3])
result[idx, 2:5] = np.cov(values[:,0:3].transpose(), ddof=0).diagonal()
else:
result[idx, 0] = values[:,3]
我尝试使用屏蔽数组但没有成功,因为我无法以正确的形式将矩阵加载到屏蔽数组中。也许有人知道该怎么做或有不同的建议。
您可以按如下方式使用np.add.reduceat
:
>>> idx = np.concatenate([[0], np.where(np.diff(sorted_A[:,4]))[0]+1, [A.shape[0]]])
>>> result2 = np.empty((idx.size-1, 5))
>>> result2[:, 0] = np.add.reduceat(sorted_A[:, 3], idx[:-1]) / np.diff(idx)
>>> result2[:, 1] = np.add.reduceat(sorted_A[:, 3]**2, idx[:-1]) / np.diff(idx) - result2[:, 0]**2
>>> result2[:, 2:5] = np.add.reduceat(sorted_A[:, :3]**2, idx[:-1], axis=0) / np.diff(idx)[:, None]
>>> result2[:, 2:5] -= (np.add.reduceat(sorted_A[:, :3], idx[:-1], axis=0) / np.diff(idx)[:, None])**2
>>>
>>> np.allclose(result, result2)
True
注意,协方差矩阵的对角线只是方差,它大大简化了这个向量化。