【问题标题】:Python make each matrix in a list to same sizePython使列表中的每个矩阵大小相同
【发布时间】:2020-11-03 02:00:16
【问题描述】:

假设具有不同行数的多个矩阵。它们包含在一个列表中。如何填充较小矩阵的行,使它们具有与最大矩阵相同的大小?

list_of_matrices = []
list_of_matrices.append(np.array([[3,3],[4,4]]))
list_of_matrices.append(np.array([[1,1,3],[2,2,5]]))
list_of_matrices.append(np.array([[1,1,3,7],[2,2,5,9]]))

从 list_of_matrices 我想创建一个 3D numpy 数组,例如形状为 3x4x2,其中缺失值(因为第一个到 2D 矩阵太小)填充了一个标量值(更具体地说,是每个矩阵围绕轴 1 的平均值)。我想以高效的方式做到这一点(没有 for 循环)。

【问题讨论】:

  • 您的数组大小不平衡,这意味着您无法连接它们,或者您应该连接至少用零填充的数组。如果每个项目有不同的形状,也需要某种循环。
  • 如何用某些值填充这个列表,使它们都具有相同的形状?我不反对某种循环(如果它是高效的,例如 numpy 函数),我只想避免 for-loops

标签: python numpy


【解决方案1】:

我尝试了各种方法并得出结论,这应该是可读且非常有效的:

z = np.zeros((3, 2, 4), dtype=int)
for i, n in enumerate(list_of_matrices):
    z[i, :n.shape[0], :n.shape[1]] = n

在尝试找到除循环之外的任何其他方法时,我得出结论,list_of_matrices 的每个列表都有不平衡数量的单元分配给z,因此即使是最聪明的方法也需要将这些组串联起来,这很慢在numpy.

这是一个连接索引组的例子:

a = [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2]
b = [0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1]
c = [0, 1, 0, 1, 0, 1, 2, 0, 1, 2, 0, 1, 2, 3, 0, 1, 2, 3]
z[a, b, c] = np.concatenate([n.ravel() for n in list_of_matrices])

它还需要np.concatenate 和列表理解,因此这里也失去了效率。但是如果你真的需要进一步优化它,你可以尝试像这样替换连接:

# Use list of lists instead because arrays are slow while iterating 
list_of_matrices = [[[3,3],[4,4]], [[1,1,3],[2,2,5]], [[1,1,3,7],[2,2,5,9]]]
from itertools import chain
concatenation = list(chain(*list(chain(*list_of_matrices))))

并应用np.repeat + repetition of specific blocks的技巧创建上述索引序列abc

【讨论】:

    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多