Python3,Numpy-矩阵元素矩阵

时间:2018-09-07 15:59:09

标签: python arrays python-3.x numpy

我想创建一个包含矩阵元素的矩阵。 所以我做了显而易见的事情,并做到了:

import numpy as np

A = np.array([1,2,3,1],[3,1,5,1])
B = np.array([1,6,8,9],[9,2,7,1])
E = np.array([A, B],[B, A])

但是编译器返回: TypeError:无法理解的数据类型

由于我的矩阵真的很大,而且我没有时间明确地写下每个人,该怎么做才能创建这样的矩阵?


*编辑1:*

发生的其他问题:

enter image description here

我得到的是多维(2,2,7,7)矩阵,而不是14x14矩阵。在简化版本中,这是我最初的问题,一切正常。为什么现在会发生这种情况的任何想法?

在这种情况下,我有Amat 7x7,Bmat 7x7,Emat 14x14,Smat 14x14


编辑2

好吧,我使用np.block()解决了该问题,如下面的注释所述。非常感谢。


3 个答案:

答案 0 :(得分:4)

假设您想要一个形状为(4, 8)的二维数组,听起来好像您在寻找numpy.block。从NumPy 1.13开始,它就可用了,顾名思义,它从块中创建了一个新数组,其中每个块都是一个现有数组。

在创建AB的呼叫中,您还需要一对额外的方括号。 numpy.array的签名是:

  

array(object,dtype = None,copy = True,order ='K',subok = False,ndmin = 0)

因此,如果您编写np.array([1, 2, 3, 1], [3, 1, 5, 1]),则将两个参数传递给array函数,第二个参数将被解释为dtype:即,所需的数据类型数组的元素。这就是为什么您会收到“无法理解的数据类型”错误的原因。相反,您希望将嵌套的列表作为第一个参数传递:np.array([[1, 2, 3, 1], [3, 1, 5, 1]])

将它们放在一起:

>>> import numpy as np
>>> A = np.array([[1, 2, 3, 1], [3, 1, 5, 1]])
>>> B = np.array([[1, 6, 8, 9], [9, 2, 7, 1]])
>>> E = np.block([[A, B], [B, A]])
>>> A
array([[1, 2, 3, 1],
       [3, 1, 5, 1]])
>>> B
array([[1, 6, 8, 9],
       [9, 2, 7, 1]])
>>> E
array([[1, 2, 3, 1, 1, 6, 8, 9],
       [3, 1, 5, 1, 9, 2, 7, 1],
       [1, 6, 8, 9, 1, 2, 3, 1],
       [9, 2, 7, 1, 3, 1, 5, 1]])

答案 1 :(得分:3)

欢迎来到堆栈溢出!

np.array希望第一个参数为矩阵,第二个参数为数据类型。

在这里,您实际上是在发送两个列表作为前两个参数。由于数字列表不是数据类型,因此它无法理解您要执行的操作。您需要将其包含在列表中:

In [4]: import numpy as np
   ...: 
   ...: A = np.array([[1,2,3,1],[3,1,5,1]])
   ...: B = np.array([[1,6,8,9],[9,2,7,1]])
   ...: E = np.array([[A, B],[B, A]], dtype=int)
   ...: 

In [5]: E
Out[5]: 
array([[[[1, 2, 3, 1],
     [3, 1, 5, 1]],

    [[1, 6, 8, 9],
     [9, 2, 7, 1]]],


   [[[1, 6, 8, 9],
     [9, 2, 7, 1]],

    [[1, 2, 3, 1],
     [3, 1, 5, 1]]]])

要发送数据类型,您可以进行例如

import numpy as np A = np.array([[1,2,3,1],[3,1,5,1]]) B = np.array([[1,6,8,9],[9,2,7,1]]) E = np.array([[A, B],[B, A]]) 。 现在,第二个参数是实际的数据类型,而不是列表。

答案 2 :(得分:1)

您接近了,只缺少了几个括号。对于矩阵,您需要给.*列表列表。

np.array