在Python 3中,将np.array对象类型转换为float类型,具有可变数量的object元素

时间:2016-08-24 16:24:04

标签: python arrays matlab numpy

我有一个带有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中的单元格。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是一个快速的方法。

您的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数组,请使用.A对象的matrix属性:

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]])

答案 1 :(得分:2)

您的vstack/hstack可以更紧凑地编写,通常为

In [132]: np.vstack((np.hstack(a) for a in A))
Out[132]: 
array([[1, 1, 2, 2],
       [1, 1, 2, 2],
       [3, 3, 4, 4],
       [3, 3, 4, 4]])

因为for a in A会对rows的{​​{1}}进行迭代。

沃伦建议A,这很好。但是,如果您查看np.bmat代码,您会看到它只是执行此类嵌套bmat(用concatenate表示一个行循环。)