【发布时间】:2019-05-31 19:04:09
【问题描述】:
我想遍历一个矩阵矩阵(确实,听起来很奇怪),
import numpy as np
ar = np.array
A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]], [[1,2,3],[4,5,6],[7,8,9]], [[20,21,22],[23,24,25],[26,27,28]]])
B = np.copy(A)
C = np.copy(A)
im = np.array([A,B,C])
为了接收在后续矩阵中存储 (x,y) 位置值的矩阵。例如,在[1,2,3]中,在1的位置上,表示:A[0,0,0],接下来的矩阵中只会出现1个。因此,我将在新矩阵中收到一个数组(同时考虑 A[0,0,1] 和 A[0,0,2]):
[[1 1 1] [2 2 2] [3 3 3]]
因此对于 A 的第一个数组:
[[[1 1 1] [2 2 2] [3 3 3]]
[[4 4 4] [5 5 5] [6 6 6]]
[[7 7 7] [8 8 8] [9 9 9]]]
我已经创建了这个函数:
def loop_ar(arr):
matrix, v, c, s = arr.shape
new = np.zeros((v,c,s,matrix)) #The columns in the last array of new represent the subsequent arrays
for x in range(v):
for y in range(c):
for s in range(s):
for ma in range(matrix):
new[x,y,s,ma] = arr[ma, x, y, s]
return new
但是,输出表明,矩阵在几圈后停止迭代:
[[[[1. 1. 1.]
[2. 2. 2.]
[3. 3. 3.]]
[[4. 4. 4.]
[5. 5. 5.]
[0. 0. 0.]]
[[7. 7. 7.]
[0. 0. 0.]
[0. 0. 0.]]]
[[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]]
...
当我在列表列表上测试这个函数时,它起作用了。在这种情况下发生了什么?我该如何解决?这只是一个简单的案例来说明我的期望;但是,我想知道一个更复杂问题的解决方案,当 B 和 C 不是 A 的副本时。如何强制循环进行迭代?
在更复杂的情况下,B 和 C 应该与 A 具有相同的形状,但是它们在最后一个数组中会有所不同。和 A 一样,我们有:
[1 2 3]
例如,在 B 中,我们会在同一位置:
[23 34 56]
在 C 中:
[54 43 32]
因此新矩阵将包含数组:
[[1 23 54] [2 34 43] [3 56 32]]
我已经完成了将列表转换为数组的任务(我希望如此),因为 loop_arr 适用于列表。然而,这是一个轮回。我想要循环中断的解决方案和解释。
这里我为更复杂的问题提供随机数据:
A = ar([[[1,2,3],[4,5,6],[7,8,9]],[[11,12,13],[14,15,16],[17,18,19]],[[20,21,22],[23,24,25],[26,27,28]]])
B = ar([[[23,34,56], [56, 78, 90], [12, 34, 32]], [[74,75,65], [25,57,76], [90,24,35]]])
C = ar([[[13,31,53], [54,96,69], [78, 90, 99]], [[35,64,66], [13,35,53], [37,73,61]], [[62, 87,97], [80,35,62], [75,76,67]]]
新矩阵如下所示:
[[[[1 23 13] [2 34 31] [3 56 53]]
[[4 56 54] [5 78 96] [6 90 69]]
[[7 12 78] [8 34 90] [9 32 99]]]
...so on, so on, so on...
]]]]
【问题讨论】:
-
a来自哪里? -
用户:对不起,最后我决定大写字母会更突出,但似乎我省略了几个“as”。 @Onyambu,我会试试这个。但是,你能解释一下你的答案吗?
-
您正在寻找
np.kron(a,np.ones(3)).reshape(np.r_[a.shape,3])在这种情况下,您正在执行kronecker乘法,这实际上是在重复矩阵 -
谢谢,我检查了文档。我不得不承认这只是一个简单的案例,kron 不符合我对更复杂问题的期望。矩阵 B、C 不必是 A 的副本。然后我怎样才能包含它们的值或强制循环迭代?
-
@fgh 你到底想达到什么目的?这仅适用于矩阵 a,您可以对任意两个矩阵进行 kronecker 乘积,也可以进行矩阵乘法或绑定以获得所需的结果
标签: python-3.x loops numpy matrix