假设我有一个 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')])
