簡體   English   中英

Python 使列表中的每個矩陣大小相同

[英]Python make each matrix in a list to same size

假設多個矩陣具有不同的行數。 它們包含在一個列表中。 如何填充較小矩陣的行,使它們具有與最大矩陣相同的大小?

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 我想創建一個例如形狀為 3x4x2 的 3D numpy 數組,其中缺失值(因為第一個到 2D 矩陣太小)用標量值填充(更具體地說是圍繞軸 1 的每個矩陣的平均值)。 我想以一種高性能的方式做到這一點(沒有 for 循環)。

我嘗試了各種方法並得出結論,這應該是可讀且非常有效的:

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 +重復特定塊的技巧創建上述索引序列a , b , c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM