Python 以numpy表示的数组的维数
我喜欢在锯齿状数组上操作,我更喜欢写 A+A 而不是 [x+y代表x,y代表zippedA,A] 为此,我想将不同大小的数组列表转换为一个完整的numpy数组,但由于似乎过于热衷于广播,因此遇到了一个错误。请注意,前三个成功,但最后一个失败:Python 以numpy表示的数组的维数,python,arrays,numpy,Python,Arrays,Numpy,我喜欢在锯齿状数组上操作,我更喜欢写 A+A 而不是 [x+y代表x,y代表zippedA,A] 为此,我想将不同大小的数组列表转换为一个完整的numpy数组,但由于似乎过于热衷于广播,因此遇到了一个错误。请注意,前三个成功,但最后一个失败: In[209]: A = array([ones([3,3]), array([1, 2])]) In[210]: A = array([ones([3,3]), array([1, 2])], dtype=object) In[211]: A = arr
In[209]: A = array([ones([3,3]), array([1, 2])])
In[210]: A = array([ones([3,3]), array([1, 2])], dtype=object)
In[211]: A = array([ones([3,2]), array([1, 2])], dtype=object)
In[212]: A = array([ones([2,2]), array([1, 2])], dtype=object)
Traceback (most recent call last):
File "/home/hzhang/.conda/envs/myenv/lib/python3.4/site-
packages/IPython/core/interactiveshell.py", line 2881, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-212-7297723106f9>", line 1, in <module>
A = array([ones([2,2]), array([1, 2])], dtype=object)
ValueError: could not broadcast input array from shape (2,2) into shape (2)
帮助?您的案例是我回答问题时第三个案例的变体 np.array尝试从输入列表创建多维数字数组。如果组件的尺寸差异很大,它会将数组分开,而创建一个对象数组。我认为这种数组是一个美化/贬低的列表 在您的问题案例中,维度足够接近,以至于它“认为”它可以生成2d数组,但当它开始填充这些值时,它发现它无法广播值,因此抛出错误。有人可能会说,它应该回溯并采用“对象”数组路径。但该决策树被深埋在编译代码中 早些时候的问题是这样的
np.array([np.zeros((2, 2)), np.zeros((2,3))])
第一个维度匹配,但第二个维度不匹配。我不完全清楚为什么你的IN[211]行得通,但IN[212]不行。但是错误消息是相同的,一直到2,2=>2次尝试
编辑
oops-我首先将您的问题示例解读为:
np.array([np.ones([2,2]), np.ones([1, 2])], dtype=object)
也就是说,将2,2与1,2结合起来,会产生一个2,的对象。你实际上是一个联合体
(2,2) with a (2,)
所以看起来目标是np.empty2,2,float或object,因为out[…]=[one[2,2],array[1,2]]会产生这个错误
在任何情况下,创建对象数组最可靠的方法是初始化它,然后复制数组
Out[90]: array([None, None], dtype=object)
In [91]: arr[:]=[ones([2,2]), array([1, 2])]
In [92]: arr
Out[92]:
array([array([[ 1., 1.],
[ 1., 1.]]), array([1, 2])], dtype=object)
对这样的对象数组进行数学运算时要小心。有效的是命中或未命中:
In [93]: A+A
Out[93]:
array([array([[ 2., 2.],
[ 2., 2.],
[ 2., 2.]]),
array([2, 4])], dtype=object)
In [96]: np.min(A[1])
Out[96]: 1
In [97]: np.min(A)
....
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [98]: A.sum()
Out[98]:
array([[ 2., 3.],
[ 2., 3.],
[ 2., 3.]])
这是因为[0]+A[1]可以工作。A[1]是2,它向3,2广播
对于对象数组,numpy求助于某种列表理解,迭代对象元素。因此可能会得到数组表示法的便利,但速度与使用真正的2d数组时的速度不同