我有一个以 dtype 作为对象的 np.array。这里的每个元素都是一个 np.array,dtype 为 float,形状为 (2,2) --- 在数学中,它是一个 2×2 矩阵。我的目标是通过将所有对象类型元素转换为浮点类型元素来获得一个二维矩阵。下面的例子可以更好地说明这一点。
dA = 2 # dA is the dimension of the following A, here use 2 as example only
A = np.empty((dA,dA), dtype=object) # A is a np.array with dtype as object
A[0,0] = np.array([[1,1],[1,1]]) # each element in A is a 2-by-2 matrix
A[0,1] = A[0,0]*2
A[1,0] = A[0,0]*3
A[1,1] = A[0,0]*4
我的目标是拥有一个矩阵 B(B 的维度是 2*dA-by-2*dA)。 B在数学中的形式应该是
B =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
如果 dA 固定为 2,那么事情会更容易,因为我可以硬编码
a00 = A[0,0]
a01 = A[0,1]
a10 = A[1,0]
a11 = A[1,1]
B0 = np.hstack((a00,a01))
B1 = np.hstack((a10,a11))
B = np.vstack((B0,B1))
但实际上,dA 是一个变量,它可以是 2 或任何其他整数。然后我不知道该怎么做。我认为嵌套 for 循环会有所帮助,但也许您有绝妙的主意。如果MATLAB中有类似cell2mat函数的东西就好了。因为在这里您可以将 A[i,j] 视为 MATLAB 中的一个单元格。
提前致谢。
最佳答案
这是一个快速的方法。
你的A
:
In [137]: A
Out[137]:
array([[array([[1, 1],
[1, 1]]), array([[2, 2],
[2, 2]])],
[array([[3, 3],
[3, 3]]), array([[4, 4],
[4, 4]])]], dtype=object)
使用numpy.bmat
,但首先将 A
转换为 python 列表,因此 bmat
会执行我们想要的操作:
In [138]: B = np.bmat(A.tolist())
In [139]: B
Out[139]:
matrix([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
结果实际上是一个numpy.matrix
。如果您需要常规的 numpy 数组,请使用 matrix
对象的 .A
属性:
In [140]: B = np.bmat(A.tolist()).A
In [141]: B
Out[141]:
array([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
这是一个替代方案。 (它仍然使用 A.tolist()
。)
In [164]: np.swapaxes(A.tolist(), 1, 2).reshape(4, 4)
Out[164]:
array([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
在一般情况下,您需要这样的东西:
In [165]: np.swapaxes(A.tolist(), 1, 2).reshape(A.shape[0]*dA, A.shape[1]*dA)
Out[165]:
array([[1, 1, 2, 2],
[1, 1, 2, 2],
[3, 3, 4, 4],
[3, 3, 4, 4]])
关于python - Python 3中,将np.array对象类型转换为float类型,对象元素个数可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39128514/