重新排列和聚合 numpy 矩阵中的列
Rearranging and aggregating columns in a numpy matrix
输入:
original_matrix =
[
[1, 0, 1, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0]
]
transformation =
[
[0, 2],
[1, 4],
[3, 6, 7]
]
输出:
transformed_matrix =
[
[2, 0, 2],
[1, 1, 1],
[0, 2, 0],
[1, 1, 1]
]
让我解释一下转换的作用。
transformed_matrix.shape[0] = original_matrix.shape[0]
,表示转换后行数不变
transformed_matrix.shape[1] = len(transformation)
,意思是 transformed_matrix
的列数与 transformation
. 中的行数相同
transformed_matrix
中的某列j
是original_matrix
中某些列的横向求和,列索引在transformation[j]
. 中提供
我怎样才能快速完成这个精确的转换?比如利用矩阵乘法?我是 numpy 的新手,我几乎把我从线性代数 class 中得到的所有知识都还给了我的大学教授...
这是使用 numpy 执行此操作的矢量化方式 -
original_matrix =np.array([
[1, 0, 1, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0]
])
transformation = np.array([
[0, 2],
[1, 4],
[3, 6, 7]
])
#transform the tranformation matrix into a 3,8 one hot encoded vector
transformation2 = np.array([np.sum(np.eye(len(original_matrix[0]))[i], axis=0) for i in transformation])
#Dot product the (4,8) and (3,8).T to get the 4,3 matrix
results = np.dot(original_matrix,transformation2.T)
results
array([[2., 0., 2.],
[1., 1., 1.],
[0., 2., 0.],
[1., 1., 1.]])
诀窍是将转换中的索引转换为以下 -
array([[1., 0., 1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 1., 1.]])
每行标记需要添加的列的列表。例如,第一行在第 0 和第 2 个位置有 1。
输入:
original_matrix =
[
[1, 0, 1, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0]
]
transformation =
[
[0, 2],
[1, 4],
[3, 6, 7]
]
输出:
transformed_matrix =
[
[2, 0, 2],
[1, 1, 1],
[0, 2, 0],
[1, 1, 1]
]
让我解释一下转换的作用。
transformed_matrix.shape[0] = original_matrix.shape[0]
,表示转换后行数不变transformed_matrix.shape[1] = len(transformation)
,意思是transformed_matrix
的列数与transformation
. 中的行数相同
transformed_matrix
中的某列j
是original_matrix
中某些列的横向求和,列索引在transformation[j]
. 中提供
我怎样才能快速完成这个精确的转换?比如利用矩阵乘法?我是 numpy 的新手,我几乎把我从线性代数 class 中得到的所有知识都还给了我的大学教授...
这是使用 numpy 执行此操作的矢量化方式 -
original_matrix =np.array([
[1, 0, 1, 1, 0, 0, 1, 0],
[0, 0, 1, 0, 1, 0, 0, 1],
[0, 1, 0, 0, 1, 0, 0, 0],
[1, 0, 0, 1, 1, 0, 0, 0]
])
transformation = np.array([
[0, 2],
[1, 4],
[3, 6, 7]
])
#transform the tranformation matrix into a 3,8 one hot encoded vector
transformation2 = np.array([np.sum(np.eye(len(original_matrix[0]))[i], axis=0) for i in transformation])
#Dot product the (4,8) and (3,8).T to get the 4,3 matrix
results = np.dot(original_matrix,transformation2.T)
results
array([[2., 0., 2.],
[1., 1., 1.],
[0., 2., 0.],
[1., 1., 1.]])
诀窍是将转换中的索引转换为以下 -
array([[1., 0., 1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 1., 1.]])
每行标记需要添加的列的列表。例如,第一行在第 0 和第 2 个位置有 1。