python - 对 3d 数组的配对数组进行排序(替换循环)
问题描述
我有以下 3d 数组:
import numpy as np
z = np.array([[[10, 2],
[ 5, 3],
[ 4, 4]],
[[ 7, 6],
[ 4, 2],
[ 5, 8]]])
我想根据 3rd dim & 1st 值对它们进行排序。
目前我正在使用以下代码:
from operator import itemgetter
np.array([sorted(x,key=itemgetter(0)) for x in z])
array([[[ 4, 4],
[ 5, 3],
[10, 2]],
[[ 4, 2],
[ 5, 8],
[ 7, 6]]])
我想通过删除 for 循环使代码更高效/更快?
解决方案
您可以在没有-loop的情况下使用map()
来实现相同的结果。for
并且 sort 函数可以是用户定义的,也可以是 lambda,或者是 的一部分sorted
:
首先创建一个排序函数:
>>> def mysort(it): ... return sorted(it, key=itemgetter(0)) ... >>> list(map(mysort, z)) [[[4, 4], [5, 3], [10, 2]], [[4, 2], [5, 8], [7, 6]]]
与上面相同,但使用 lambda 代替:
>>> list(map(lambda it: sorted(it, key=itemgetter(0)), z)) [[[4, 4], [5, 3], [10, 2]], [[4, 2], [5, 8], [7, 6]]]
有一个
partial
:>>> from functools import partial >>> psort = partial(sorted, key=itemgetter(0)) >>> list(map(psort, z)) [[[4, 4], [5, 3], [10, 2]], [[4, 2], [5, 8], [7, 6]]]
或部分就地定义:
>>> list(map(partial(sorted, key=itemgetter(0)), z)) [[[4, 4], [5, 3], [10, 2]], [[4, 2], [5, 8], [7, 6]]]
您的问题有一个列表列表,而不是 3d numpy 数组。对于面向 numpy 的解决方案,请参阅此答案。
仅供参考,(2)和(3b)大致等价,但有它们的区别。
在选项 1-3 中,我更喜欢 (2) 中的 lambda。
推荐阅读
- cmake - 为什么不能从 cmake 脚本调用 wsl?
- c++ - CPP 或 H 中的助手
- orocommerce - 如何在我的自定义主题中包含自定义 js 文件?
- reactjs - 如何在没有外部 API 的情况下在 React 中发布表单数据
- c - 在缺乏知识的情况下用 C 语言编写二叉树
- php - 一般错误:1364 字段 'parent_id' 没有默认值
- curl - 如何使用 dart 显示 http 请求的响应正文?
- julia - 如何计算将矩阵保存为向量的矩阵乘法
- python - 获取 asyncio.Queue 中的所有项目并返回它们
- spring-boot - 从 PCF 连接发布/订阅的问题