我正在做一些Python3的实现,我需要一些帮助。我有一个函数,它依赖于矩阵的维数。我实际上有两个矩阵,并且想以某种方式得到第三个矩阵。例如(二维矩阵):
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维矩阵的另一个例子:
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向量。
发布于 2019-07-01 21:39:11
下面是一个粗略的递归实现,使用一个额外的参数来指定递归深度(本质上,当您说它是一个n
-dimensional矩阵时,什么是n
?):
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
的较浅元素。
发布于 2019-07-01 21:54:36
重塑阵列呢?你需要n维空间吗?
否则,您可以将两个矩阵转换为一维数组,构建第三个矩阵,然后重塑结果
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
https://stackoverflow.com/questions/56836496
复制相似问题