python - 如何转置一个空的 numpy 数组?
问题描述
我在 numpy 中有一个“空”二维数组
arr = np.array([[[], [], []], [[], [], []]])
.
当我这样做时np.transpose(arr)
,我得到了结果:[]
,而不是预期的:
[[[],[]],[[],[]],[[],[]]]
.
解决方案
看看你的表达产生了什么:
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
更完整的显示告诉我们shape
和dtype
。 np.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
清楚地表明它包含列表对象。
但是你真的需要这样的数组吗?额外的工作值得吗?
推荐阅读
- amazon-web-services - 如何在 EC2 实例上运行 tensorflow 程序,同时保持免费套餐
- javascript - 为 .includes 添加了 poly-fill,但在一个区域仍然出现错误,尽管在所有其他区域都已解决
- git - 通过 VPN 使用时 Git 命令停止
- php - 使用 .htacess 不允许直接 url 访问文件
- python-3.x - 使用 BigQuery / Python3 / Reddit “项目名称需要用点分隔”错误
- mongodb - 从 Spark 写入 Mongo 副本集(在 Scala 中)
- windbg - 如何通过 CLRMD 获取 WinDBG 中显示的异常
- javascript - 缓慢的视频逐渐停止
- node.js - 如何让我的 nodejs 套接字应用程序从 azure VM 外部可见
- django - 如何覆盖 get_swagger_view 以使 django-rest-swagger 显示所有端点?