Python 以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

我喜欢在锯齿状数组上操作,我更喜欢写 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 = 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数组时的速度不同