【问题标题】:Rearranging and aggregating columns in a numpy matrix重新排列和聚合 numpy 矩阵中的列
【发布时间】:2020-11-15 13:17:56
【问题描述】:

输入:

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]
]

让我解释一下转换的作用。

  1. transformed_matrix.shape[0] = original_matrix.shape[0],表示转换后的行数将始终保持不变。
  2. transformed_matrix.shape[1] = len(transformation),表示transformed_matrix 的列数与transformation 中的行数相同。
  3. transformed_matrix中的j列是original_matrix中某些列的水平总和,列索引在transformation[j]中提供。

我怎样才能快速完成这种精确的转换?比如利用矩阵乘法?我对 numpy 还是很陌生,而且我几乎已经将线性代数课上的所有知识都传授给了我的大学教授......

【问题讨论】:

  • transformed_matrix 有 3 列,transformation 有 3 行。我确实犯了一个错误,因为transformation 不是矩阵。所以我不应该说transformation的形状。

标签: python numpy matrix matrix-multiplication


【解决方案1】:

这是使用 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。

【讨论】:

  • 你真是太不可思议了!随着时间的推移,我会变得更好吗?我在没有经验的情况下开始在工作中使用 ML。你到底是怎么做到的,这么快,这么高效,还有这么多细节?
  • 感谢您的好心 cmets,我建议您使用 numpy 并深入了解点积和元素转换。这将帮助您非常轻松地构建矢量化代码。当然,如果你坚持下去,不久之后你就可以自己编写高效的代码了:)
  • 非常感谢!我会花更多时间学习 numpy 的基础知识!
猜你喜欢
  • 2012-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2016-03-25
  • 2020-06-04
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多