python - 将numpy嵌套数组重塑为数组
问题描述
我有一个形状喜欢的 numpy 数组
a1.shape
# 1000
a1[0].shape
# (100, 100, 3)
我想改变形状
a1.shape
# (1000, 100, 100, 3)
我怎样才能做到这一点?
解决方案
列出具有不同形状(但元素数量相同)的数组:
In [72]: alist = [np.ones((2,3),int),np.zeros(6,int),np.arange(6)]
In [73]: alist
Out[73]:
[array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4, 5])]
In [74]: np.array(alist)
Out[74]:
array([array([[1, 1, 1],
[1, 1, 1]]), array([0, 0, 0, 0, 0, 0]),
array([0, 1, 2, 3, 4, 5])], dtype=object)
结果是一个对象 dtype 数组。
但是如果我们将列表的所有元素重新整形为相同的形状,我们会得到一个 3d 数组:
In [75]: np.array([x.reshape(2,3) for x in alist])
Out[75]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
现在让我们在创建数组后尝试重塑元素:
In [76]: arr = np.array(alist)
In [77]: arr.shape
Out[77]: (3,)
In [78]: for i in range(3):
...: arr[i] = arr[i].reshape(2,3)
...:
In [79]: arr
Out[79]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
In [80]: np.array(arr)
Out[80]:
array([array([[1, 1, 1],
[1, 1, 1]]),
array([[0, 0, 0],
[0, 0, 0]]),
array([[0, 1, 2],
[3, 4, 5]])], dtype=object)
调用array
该数组不会改变任何东西。
但stack
确实有效(stack
只是一个方便的版本concatenate
):
In [82]: np.stack(arr)
Out[82]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
stack
接受一个数组列表,或者它是一个数组,在第一个维度上迭代:
In [83]: np.stack([x for x in arr])
Out[83]:
array([[[1, 1, 1],
[1, 1, 1]],
[[0, 0, 0],
[0, 0, 0]],
[[0, 1, 2],
[3, 4, 5]]])
推荐阅读
- javascript - 如何正确设置标签和文本框填充?
- android - 无法在图像视图中看到我拍摄的原始照片
- node.js - 在 NodeJS 中放置函数来操作 MongoDB 不起作用
- angular - Karma Runner 找不到从 tsconfig.json 到 ES6 模块的路径
- reactjs - GraphQL 订阅不会监听所有新的创作 - react-apollo
- angularjs - 跨域发布请求Angular js
- python - 在 pandas.DataFrame.query() 表达式中使用负数
- python - 如何使用 tzlocal 查找正确的时区?
- python - 从 HTTP 标头的每一列指定 read_csv 中每一列的数据类型
- css - 如何在没有 runat="server" 的情况下在 asp.net 代码中为 div 添加样式