您必須確保在每個維度上預先分配正確數量的維度和元素,以便使用簡單分配來填充它。
例如要保存3個2x3
矩陣:
number_of_matrices = 3
matrix_dim_1 = 2
matrix_dim_2 = 3
M = np.empty((number_of_matrices, matrix_dim_1, matrix_dim_2))
M[0] = np.array([[ 0, 1, 2], [ 3, 4, 5]])
M[1] = np.array([[100, 101, 102], [103, 104, 105]])
M[2] = np.array([[ 10, 11, 12], [ 13, 14, 15]])
M
#array([[[ 0., 1., 2.], # matrix 1
# [ 3., 4., 5.]],
#
# [[ 100., 101., 102.], # matrix 2
# [ 103., 104., 105.]],
#
# [[ 10., 11., 12.], # matrix 3
# [ 13., 14., 15.]]])
你的方法包含了一些問題。要保存的陣列是不是一個有效的n維數組numpy的:
np.array([[0], [0,1,2], [3,4,5]])
# array([[0], [0, 1, 2], [3, 4, 5]], dtype=object)
# |----!!----|
# ^-------^----------^ 3 items in first dimension
# ^ 1 item in first item of 2nd dim
# ^--^--^ 3 items in second item of 2nd dim
# ^--^--^ 3 items in third item of 2nd dim
它只是創建了一個包含蟒蛇list
對象的3項數組。你可能想要一個包含數字的數組,所以你需要關心維度。您的np.array([[0], [0,1,2], [3,4,5]])
可能是3x1陣列或3x3陣列,numpy不知道在這種情況下要做什麼並將其保存爲對象(該陣列現在只有1維!)。
另一個問題是,你想設置預分配數組的一個元素與另一個包含多個元素的數組。這是不可能的(除非你已經有一個object
-陣列)。你這裏有兩種選擇:
填補了預分配的數組中的元素數由陣列所需:
M[0, :, :] = np.array([[0,1,2], [3,4,5]])
# ^--------------------^--------^ First dimension has 2 items
# ^---------------^-^-^ Second dimension has 3 items
# ^------------------------^-^-^ dito
# if it's the first dimension you could also use M[0]
創建object
陣列和設置元素(不推薦這樣做,最鬆的numpy的陣列)的優點是:
M = np.empty((3), dtype='object')
M[0] = np.array([[0,1,2], [3,4,5]])
M[1] = np.array([[0,1,2], [3,4,5]])
M[2] = np.array([[0,1,2], [3,4,5]])
M
#array([array([[0, 1, 2],
# [3, 4, 5]]),
# array([[0, 1, 2],
# [3, 4, 5]]),
# array([[0, 1, 2],
# [3, 4, 5]])], dtype=object)
您的示例將不起作用,因爲您在'np.array'調用中忘記了封閉的'[]'。也請使用實數而不是未定義的變量,以便更容易地看到你想要的。目前,每個't','x000'都可以是一個數字或一個numpy數組,或者完全是別的。另請參閱:[mcve] – MSeifert
謝謝,'[]'不幸不是缺少的。我編輯了這個例子,我也發現我需要'M.shape =(m,n,3)'。但它仍然行不通。 – grinsbaeckchen
爲什麼不只是收集陣列上的列表? – hpaulj