【问题标题】:Python3 , Numpy -- Matrix of Matrix elementsPython3,Numpy——矩阵元素的矩阵
【发布时间】:2018-09-07 15:59:09
【问题描述】:

我想创建一个包含矩阵元素的矩阵。 所以我做了很明显的事情并做了这个:

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:*

发生的其他问题:

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

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


编辑 2

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


【问题讨论】:

  • A= 行有错误,不是吗?它甚至没有到达E 步骤。换句话说,这是使用np.array的基本问题。
  • 更正np.array 语法,对于您想要的内容仍有一些歧义。一个答案产生一个 (4,8) 数组,另一个产生 (2,2,2,4)。
  • 一个吹毛求疵:你几乎肯定想要一个 NumPy array(类型 ndarray)而不是 matrix。区别很重要:NumPy 确实具有 矩阵类型,但使用起来可能很尴尬,并且并不总是与 NumPy 的其余部分或其他使用 NumPy 的库很好地集成。随着最近出现的用于矩阵式乘法的@ 运算符,使用矩阵类型的理由并不多。

标签: python arrays python-3.x numpy


【解决方案1】:

假设您想要一个形状为(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]])

【讨论】:

  • 谢谢。但是当我运行程序时,变量资源管理器(我正在使用 Spyder)说我的原始矩阵 E 的大小是 (2,2,7,7) 而不是 (14,14)。发生了什么?
  • @GeometricalFlows:再次阅读关于numpy.block的部分。
【解决方案2】:

欢迎来到 Stack Overflow!

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

在这里,您实际上发送了两个列表作为前两个参数。由于数字列表不是数据类型,因此它不了解您要做什么。您需要将其包含在一个列表中:

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

要发送数据类型,您可以这样做,例如

D = np.array([1,2,3,4,5], np.float32)。 现在第二个参数是一个实际的数据类型,而不是一个列表。

【讨论】:

    【解决方案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]]]])
    

    【讨论】:

    • 这些是大括号:{}。它们有时被称为花括号。这些是方括号:[],有时在可能引起混淆时称为方括号。
    • 您的回答真棒!我希望你不会介意只是一些指示?当有人出现错误时,特别是如果 OP 是网站上的新用户,通常可以合理地假设 OP 不知道此错误的含义。如果您提供链接和错误发生原因的描述,您可以期望在您的答案中获得更多代表!再说一遍:很高兴你能提供帮助,而这也是我想要做的!
    猜你喜欢
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多