如何用Pythonic方法获取NumPy多维数组中最短子数组的形状?
当然有Pythonic的解决办法啦!针对你这种内部子数组长度不一的object类型NumPy数组,下面几个方法都能高效找到最短子数组的长度(也就是你说的「最短形状」):
方法1:列表推导式 +
min() 函数 这是最直观也最符合Python风格的写法,直接遍历数组里的每个子数组,提取它们的长度(通过shape[0],因为你的子数组都是一维的),再取最小值:
import numpy as np x = np.array([ np.array([0, 1, 2, 3, 4, 5]), np.array([0, 1, 2, 3, 4]), np.array([0, 1, 2, 3]), np.array([0, 1, 2, 3, 4]), np.array([0, 1, 2, 3, 4, 5, 6]), ]) min_sub_length = min(sub_arr.shape[0] for sub_arr in x) print(min_sub_length) # 输出:4
方法2:
map() + 匿名函数 + min() 如果你习惯用map函数处理迭代对象,也可以这么写,逻辑和上面完全一致:
min_sub_length = min(map(lambda arr: arr.shape[0], x))
补充说明
你的数组x是object类型的NumPy数组——因为内部子数组长度不一致,NumPy无法将它转换成规整的多维数组,所以直接迭代x就能逐个获取里面的子数组,操作起来和普通Python列表几乎一样。如果你的子数组是多维的,想要获取完整的最短形状(比如(2,3)这种),可以把代码改成min(sub_arr.shape for sub_arr in x),它会按元组的比较规则找出最小的形状。
内容的提问来源于stack exchange,提问作者allexlima
相关产品推荐
相关产品推荐

