首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有可变数量的For循环和可变数量的变量的函数

具有可变数量的For循环和可变数量的变量的函数
EN

Stack Overflow用户
提问于 2019-07-01 21:23:11
回答 2查看 85关注 0票数 2

我正在做一些Python3的实现,我需要一些帮助。我有一个函数,它依赖于矩阵的维数。我实际上有两个矩阵,并且想以某种方式得到第三个矩阵。例如(二维矩阵):

代码语言:javascript
运行
复制
def my_matrix_2d(mat1, mat2):
    ar = []
    for i in range(len(mat1[0])):
        ar1 = []
        for j in range(len(mat1[1])):
            try:
                ar1.append([mat1[0][i], mat1[1][j], mat2[i][j]])
            except IndexError:
                ar1.append([mat1[0][i], mat1[1][j], None])
        ar.append(ar1)
    return ar

3维矩阵的另一个例子:

代码语言:javascript
运行
复制
def my_matrix_3d(mat1, mat2):
    ar = []
    for i in range(len(mat1[0])):
        ar1 = []
        for j in range(len(mat1[1])):
            ar2 = []
            for k in range(len(mat1[2])):
                try:
                    ar2.append([mat1[0][i], mat1[1][j], mat1[2][k], mat2[i][j][k]])
                except IndexError:
                    ar2.append([mat1[0][i], mat1[1][j], mat1[2][k], None])
            ar1.append(ar2)
        ar.append(ar1)
    return ar

我需要做一个关于n维矩阵的一般函数。我知道这一定是与递归有关,但我就是搞不明白。如果有任何帮助,我将不胜感激。

编辑:

我实际上没有很好地描述我的问题,所以我将尝试给出详细的描述。首先,我将描述2D问题。我们有两个矩阵,mat1和mat2。len(mat1)=2,假设len(mat1)=m且len(mat11)=n。那么,mat2是m×n矩阵,因此对于i=0,1,...,m-1,len(mat2)=m且len(mat2i)=n。my_matrix_2d是一个函数,它以某种方式组合了这两个矩阵。让我们来看一个具体的例子:我们可以看到mat1是2D直方图的仓位边缘,mat2是仓位高度,所以mat1表示x坐标的仓位边缘,mat11表示y坐标的仓位边缘。mat2表示x和y坐标边的交点上的箱体高度。因此,my_matrix_2d在二维直方图中存储关于垃圾桶、边缘和高度的信息。它的元素是向量(mat1,mat11,mat2i),因为我们还需要一条边来确定bin的宽度,所以最后一个向量是(mat1,mat11,None)。

类似于3D示例。mat10是x坐标中的箱体边,mat11是y坐标中的箱体边,mat12是z坐标中的箱体边,mat2是包含箱体高度的mxnxo矩阵。my_matrix_3d输出应该是包含元素(mat1,mat11,mat12,mat2ik)的矩阵/数组,其中i=0,...,m-2,j=0,...,n-2,k=0,...,o-2,如果i=m-1或j=n-1或k=o-1,则矩阵中的元素应为(mat1,mat11,mat12,None)。

P.S. my_matrix_nd应为n维矩阵,其形状与P.S. mat2相同。但是mat2中的元素是浮点数,而my_matrix_nd中的元素是len(mat1)+1向量。

EN

回答 2

Stack Overflow用户

发布于 2019-07-01 21:39:11

下面是一个粗略的递归实现,使用一个额外的参数来指定递归深度(本质上,当您说它是一个n-dimensional矩阵时,什么是n?):

代码语言:javascript
运行
复制
def my_matrix_nd(mat1, mat2, depth=1):
    # base case
    if depth == 0:
        return [mat2]
    # recursive case
    ar = []
    for i in range(len(mat1[0])):
        try:
            ar.append([mat1[0][i]] + my_matrix_nd(mat1[1:], mat2[i], depth-1))
        except IndexError:
            ar.append([mat1[0][i], None])
    return ar

它使用列表切片为每次递归切断mat1的第一个元素,并通过递归地一次传递一个子列表来隔离mat2[i][j][k]。在基本情况下,它尝试只返回mat2的焦点值(但作为单元素列表,因此我们可以在其前面加上其他参数)。然后,在返回递归链的过程中,我们依次添加mat1的较浅元素。

票数 0
EN

Stack Overflow用户

发布于 2019-07-01 21:54:36

重塑阵列呢?你需要n维空间吗?

否则,您可以将两个矩阵转换为一维数组,构建第三个矩阵,然后重塑结果

代码语言:javascript
运行
复制
def operate_ndim(mat1, mat2):
    shape1 = mat1.shape
    shape2 = mat2.shape

    if shape1 != shape2: return -1 # I assume that with different shapes it breaks

    dim_1d   =  np.size(mat1)

    mat1 = mat1.reshape(dim_1d)
    mat2 = mat2.reshape(dim_1d)
    res  = np.zeros(dim_1d)

    for i in range(dim_1d):
        res[i] = mat1[0] + mat2[100] + mat2[i] - mat1[-i]   # operation rule

    res = res.reshape(shape1)
    return res
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56836496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档