我有一个Python脚本,不知怎的,在我的Numpy计算中,我得到了一个这样的变量:
In [72]: a
Out[72]:
array([[ array([-0.02134025+0.1445159j , -0.02136137+0.14458584j,
-0.02138250+0.14465578j, ..., -0.01568173+0.12424096j,
-0.01569507+0.12429295j, -0.01570842+0.12434494j]),
array([-0.14451590+0.97865975j, -0.14458584+0.97863863j,
-0.14465578+0.9786175j , ..., -0.12424096+0.98431827j,
-0.12429295+0.98430493j, -0.12434494+0.98429158j])],
[ array([-0.14451590+0.97865975j, -0.14458584+0.97863863j,
-0.14465578+0.9786175j , ..., -0.12424096+0.98431827j,
-0.12429295+0.98430493j, -0.12434494+0.98429158j]),
array([ 0.02134025-0.1445159j , 0.02136137-0.14458584j,
0.02138250-0.14465578j, ..., 0.01568173-0.12424096j,
0.01569507-0.12429295j, 0.01570842-0.12434494j])]], dtype=object)
In [73]: np.shape(a)
Out[73]: (2, 2)
所以它基本上是一个二维数组,其中每个元素都是一个长度为n
的数组,但不知何故a
不是形状(2,2,n)
的3D数组。您可以在打印输出中的每个元素中看到额外的单词array
。我不明白这是怎么发生的,但是我想将a
变成一个形状为(2,2,n)
的3D数组,因为我有其他(2,2,n)
个变量,而且它们是'不可互操作。 (如果我可以将其他(2,2,n)
数组转换为与a
相同的可能也可能有效的数据,我猜。)
例如,像这样的形状(2,2,3)
的数组不会在每个元素中打印出额外的array
字词。形状为(2,2,3)
而非(2,2)
。
In [75]: np.zeros((2,2,3))
Out[75]:
array([[[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.]]])
我尝试了np.asarray(a)
和a.reshape((2,2,))
,但他们没有做任何事情,我猜它已经是一个阵列了。
更新:这是生成类似a
的类似代码:
In [80]: T1 = np.array([ [np.linspace(0,1,5),0],[0,1] ])
In [81]: T1
Out[81]:
array([[array([ 0. , 0.25, 0.5 , 0.75, 1. ]), 0],
[0, 1]], dtype=object)
In [82]: T2 = np.identity(2)
In [83]: T2
Out[83]:
array([[ 1., 0.],
[ 0., 1.]])
In [84]: T3 = np.dot(T1,T2)
In [85]: T3
Out[85]:
array([[array([ 0. , 0.25, 0.5 , 0.75, 1. ]),
array([ 0., 0., 0., 0., 0.])],
[0.0, 1.0]], dtype=object)
In [86]: T4 = np.dot(T2,T3)
In [87]: T4
Out[87]:
array([[array([ 0. , 0.25, 0.5 , 0.75, 1. ]),
array([ 0., 0., 0., 0., 0.])],
[array([ 0., 0., 0., 0., 0.]), array([ 1., 1., 1., 1., 1.])]], dtype=object)
元素长度相同,asarray
无效。
In [88]: np.asarray(T4)
Out[88]:
array([[array([ 0. , 0.25, 0.5 , 0.75, 1. ]),
array([ 0., 0., 0., 0., 0.])],
[array([ 0., 0., 0., 0., 0.]), array([ 1., 1., 1., 1., 1.])]], dtype=object)
答案 0 :(得分:0)
此行为是由您使用的complex
数据类型引起的。如果仔细查看数组,可以发现内部数组的dtype
为object
而不是complex
。请在计算/创建期间通过正确设置内部数组的dtype
来检查是否已解决此问题。
如果这没有帮助,请检查this SO线程。这是一个类似的问题,可能会为您提供一个简单的解决方案。
答案 1 :(得分:0)
a
是一个2d数组,其中每个元素都是1d数组。
np.array(...)
尝试创建尽可能高的维数组。但是,如果子元素(或列表)的大小不同,它就可以生成对象数组(或者在某些情况下会引发错误)。你的T1
就是这种阵列。
如果您的子阵列形状相同,我们可以将其转换为3d数组。
我无法使用copynpaste重新创建T4
,因为np.array
制作了一个3d数组:
In [35]: array = np.array
In [36]: T4= array([[array([ 0. , 0.25, 0.5 , 0.75, 1. ]),
...: array([ 0., 0., 0., 0., 0.])],
...: [array([ 0., 0., 0., 0., 0.]), array([ 1., 1., 1., 1., 1
...: .])]], dtype=object)
...:
In [37]: T4
Out[37]:
array([[[0.0, 0.25, 0.5, 0.75, 1.0],
[0.0, 0.0, 0.0, 0.0, 0.0]],
[[0.0, 0.0, 0.0, 0.0, 0.0],
[1.0, 1.0, 1.0, 1.0, 1.0]]], dtype=object)
但是使用dot
序列:
In [41]: T1 = np.array([ [np.linspace(0,1,5),0],[0,1] ])
In [42]: T2 = np.identity(2)
In [43]: T3 = np.dot(T1,T2)
In [44]: T4 = np.dot(T2,T3)
但我可以将其转换为concatenate
的一个数组。实际上stack
在这里最好。但首先我必须把它变成一个1d数组(4,)。 np.vstack
也可以。实际上它现在是4个5元素阵列的列表:
In [47]: np.stack(T4.ravel())
Out[47]:
array([[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. ],
[ 1. , 1. , 1. , 1. , 1. ]])
In [48]: _.reshape(2,2,-1)
Out[48]:
array([[[ 0. , 0.25, 0.5 , 0.75, 1. ],
[ 0. , 0. , 0. , 0. , 0. ]],
[[ 0. , 0. , 0. , 0. , 0. ],
[ 1. , 1. , 1. , 1. , 1. ]]])
通常我通过制作一个空白对象数组来重新创建像T4
这样的数组,例如a = np.zeros((2,2),object)
,然后从列表中填充插槽。但是海报也是从第三方包中获得的。所以这个stack
技巧很有用。