【问题标题】:Numpy reshape - automatic filling or removalNumpy reshape - 自动填充或移除
【发布时间】:2019-09-27 14:36:36
【问题描述】:

我想找到一个 reshape 函数,它能够将我的不同维度的数组转换为相同维度的数组。让我解释一下:

import numpy as np
a = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]]])
b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[1,2,3,3],[1,2,3,3]]])

我希望能够使b,c 形状等于a 形状。但是,np.reshape 会引发错误,因为正如此处 (Numpy resize or Numpy reshape) 所述,该函数明确用于处理相同的维度。

我想要该函数的某个版本,如果形状较小,则在第一个维度的开头添加零,如果形状较大,则删除开头。我的示例将如下所示:

b = np.array([[[1,2,3,3],[1,2,3,3]],[[1,2,3,3],[1,2,3,4]]])
c = np.array([[[0,0,0,0],[0,0,0,0]],[[1,2,3,3],[1,2,3,3]]])

我需要编写自己的函数来做到这一点吗?

【问题讨论】:

  • 有一个np.pad 函数。但这可能并不比答案更容易使用。有很多不同的填充方式,很难提供通用的功能。在您的情况下,您在一开始就做了奇怪的填充!从长远来看,你会更好地理解所提供的答案,而不是寻找一个完全符合你需要的函数。

标签: python numpy reshape


【解决方案1】:

这类似于上面的解决方案,但如果较低的尺寸不匹配也可以工作

def custom_reshape(a, b):
    result = np.zeros_like(a).ravel()
    result[-min(a.size, b.size):] = b.ravel()[-min(a.size, b.size):]
    return result.reshape(a.shape)

custom_reshape(a,b)

【讨论】:

    【解决方案2】:

    我会写一个这样的函数:

    def align(a,b):
        out = np.zeros_like(a)
        x = min(a.shape[0], b.shape[0])
        out[-x:] = b[-x:]
    
        return out
    

    输出:

    align(a,b)
    # array([[[1, 2, 3, 3],
    #         [1, 2, 3, 3]],
    
    #        [[1, 2, 3, 3],
    #         [1, 2, 3, 4]]])
    
    align(a,c)
    # array([[[0, 0, 0, 0],
    #         [0, 0, 0, 0]],
    
    #        [[1, 2, 3, 3],
    #         [1, 2, 3, 3]]])
    

    【讨论】:

    • 这是一个聪明的解决方案。是否可以将其扩展到任何形状,基本上是重新创建a 的确切形状。
    • 应该可以使用x = np.min( a.shape, b.shape)
    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 2011-05-11
    • 2021-03-01
    • 2021-11-20
    • 1970-01-01
    • 2019-07-09
    • 2021-06-04
    • 2012-10-03
    相关资源
    最近更新 更多