首页 > 解决方案 > 如何转置一个空的 numpy 数组?

问题描述

我在 numpy 中有一个“空”二维数组

arr = np.array([[[], [], []], [[], [], []]]).

当我这样做时np.transpose(arr),我得到了结果:[],而不是预期的:

[[[],[]],[[],[]],[[],[]]].

标签: pythonnumpynumpy-ndarray

解决方案


看看你的表达产生了什么:

In [41]: arr = np.array([[[], [], []], [[], [], []]])                           
In [42]: arr                                                                    
Out[42]: array([], shape=(2, 3, 0), dtype=float64)
In [43]: print(arr)                                                             
[]
In [44]: print(repr(arr))                                                       
array([], shape=(2, 3, 0), dtype=float64)

打印显示str显示,而repr更完整的显示告诉我们shapedtypenp.array一直跟随[],制作了一个具有浮点元素的 3d 数组。但由于最低级别是从 创建的[],它的大小为 0 维,并且整个数组有 0 个元素。

根据评论,您想要的是一个具有 object dtype 的 (2,3) 数组。这可以保存诸如列表之类的对象。但要做到这一点np.array很棘手。一种更通用的工具是制作具有正确形状和 dtype 的工具。

我喜欢用这个,因为它用元素empty填充对象数组。None(在数字 dtypenp.empty中还有其他问题,但对于对象来说很好。)

In [45]: arr = np.empty((2,3), dtype=object)                                    
In [46]: arr                                                                    
Out[46]: 
array([[None, None, None],
       [None, None, None]], dtype=object)

但是尝试将列表分配给此类数组的元素可能会很棘手:

In [47]: arr[:]=[]                                                              
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-b5ed8d639464> in <module>
----> 1 arr[:]=[]

ValueError: could not broadcast input array from shape (0) into shape (2,3)
In [48]: np.full((2,3),[])                                                      
...
ValueError: could not broadcast input array from shape (0) into shape (2,3)

full有同样的问题。另外像这样的赋值,如果有效的话,会在每个槽中放置相同的列表,相当于用[[]]*3. 我们希望[]每个插槽都有一个新的。

我们可以在 2d 中执行此操作arr,但使用 1d 迭代更简单(稍后可以重新调整):

In [49]: arr = np.empty(6, object)                                              
In [50]: arr                                                                    
Out[50]: array([None, None, None, None, None, None], dtype=object)
In [51]: for i in range(6): arr[i]=[]                                           
In [52]: arr                                                                    
Out[52]: 
array([list([]), list([]), list([]), list([]), list([]), list([])],
      dtype=object)
In [53]: arr = np.reshape(arr, (2,3))                                           
In [54]: arr                                                                    
Out[54]: 
array([[list([]), list([]), list([])],
       [list([]), list([]), list([])]], dtype=object)

显然我们可以转置它,但也可以在重塑中使用 (3,2)。

请注意,此显示arr清楚地表明它包含列表对象。

但是你真的需要这样的数组吗?额外的工作值得吗?


推荐阅读