Skip to main content
 首页 » 编程设计

python之将现有 Numpy ndarray 的值转换为元组

2025年05月04日26mengfanrong

假设我有一个 numpy.ndarray 和 shape (2,3,2) 如下,

arr = np.array([[[1,3], [2,5], [1,2]],[[3,3], [6,5], [5,2 ]]])

我想以这样的方式 reshape 它:

arr.shape == (2,3) 
arr == [[(1,3), (2,5), (1,2)],[(3,3), (6,5), (5,2)]] 

和 arr 的每个值都是一个大小为 2 的 tuple

我想这样做的原因是我想沿 3 维数组的轴 0 取最小值,但我想保留与行的最小值配对的值。

arr = np.array( 
  [[[1, 4], 
    [2, 1], 
    [5, 2]], 
 
   [[3, 3], 
    [6, 5], 
    [1, 7]]]) 
 
print(np.min(arr, axis=0)) 
>>> [[1,3],  
     [2,1], 
     [1,2]] 
>>>Should be 
    [[1,4], 
     [2,1], 
     [1,7]] 

如果数组包含元组,它将是二维的,并且最小化的比较运算符仍然可以正常运行, 所以我会得到正确的结果。但是除了遍历数组之外我还没有找到任何方法来做到这一点,这是低效的并且在实现中很明显。

是否可以在 numpy 中高效地执行此转换?

请您参考如下方法:

根本不要使用元组 - 只需将其视为结构化数组,它支持您所追求的词法比较:

a = np.array([[[1,3], [2,5], [1,2]],[[3,3], [6,5], [5,2]]]) 
 
a_pairs = a.view([('f0', a.dtype), ('f1', a.dtype)]).squeeze(axis=-1) 
min_pair = np.partition(a_pairs, 0, axis=0)[0]  # min doesn't work on structured types :( 
array([(1, 4), (2, 1), (1, 7)],  
      dtype=[('f0', '<i4'), ('f1', '<i4')])