我想创建一个包含矩阵元素的矩阵。 所以我做了显而易见的事情,并做到了:
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:*
发生的其他问题:
我得到的是多维(2,2,7,7)矩阵,而不是14x14矩阵。在简化版本中,这是我最初的问题,一切正常。为什么现在会发生这种情况的任何想法?
在这种情况下,我有Amat 7x7,Bmat 7x7,Emat 14x14,Smat 14x14
编辑2
好吧,我使用np.block()解决了该问题,如下面的注释所述。非常感谢。
答案 0 :(得分:4)
假设您想要一个形状为(4, 8)
的二维数组,听起来好像您在寻找numpy.block
。从NumPy 1.13开始,它就可用了,顾名思义,它从块中创建了一个新数组,其中每个块都是一个现有数组。
在创建A
和B
的呼叫中,您还需要一对额外的方括号。 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