【问题标题】:3D matrix truth table3D矩阵真值表
【发布时间】:2017-06-29 19:14:27
【问题描述】:

我在概念化 3 维矩阵时遇到了困难,我需要它来制作各种真值表。我正在尝试通过 3D 矩阵,并将每个元素与与其相邻的所有其他元素进行比较(但不在对角线上)。我有一个函数 (truth_table),它应该采用一组 3D 坐标并返回一个矩阵,该矩阵告诉我可以安全调用哪些周围坐标,而不必担心 INDEX_OUT_OF_BOUNDS 异常。我是 N 维矩阵的新手,在制作这个真值表时遇到了麻烦,这在 2D 中很容易。

import numpy as np
array_rows=10
array_cols=10
array_height=10
laser_power=2e-3

T_MATRIX=np.full((array_rows,array_cols,array_height),0.0)
H_MATRIX=np.full((array_rows,array_cols,array_height),0.0)
H_MATRIX[5,5,5]=laser_power
constants=0.5

def truth_table(row,col,height):
    skeleton=np.array([
    [[False,False,False],[False,height<array_height-1,False],[False,False,False]],[[False,row>0,False],[col>0,False,col<array_cols-1],[False,row<array_rows-1,False]],[[False,False,False],[False,height>0,False],[False,False,False]]])

def update_T():
    global T_MATRIX
    for row in range(array_rows):
        for col in range(array_cols):
            for height in range(array_height):
                T_MATRIX[row][col][height]+=H_MATRIX[row][col][height]*constants

def reset_H():
    global H_MATRIX
    for row in range(array_rows):
        for col in range(array_cols):
            for height in range(array_height):
                H_MATRIX[row][col][height]=0.0
    H_MATRIX[5,5,5]=laser_power

def update_H():
    global H_MATRIX
    for row in range(array_rows):
        for col in range(array_cols):
            for height in range(array_height):
                my_table=truth_table(row,col,height)
                count=np.sum(my_table)
                T_DIFF=0.0
                AVG_T=0.0
                for r in range(3):
                    for c in range(3):
                        for h in range(3):
                            if(my_table[r][c][h]):
                                T_DIFF+=T_MATRIX[row][col][height]-T_MATRIX[row+(r-1)][col+(c-1)][height+(h-1)]
                if(count>0):
                    AVG_T=T_DIFF/count
                H_MATRIX[row][col][height]+=T_DIFF*constants


def update_stuff():
    ##UPDATE THE TEMP
    update_T()
    reset_H()
    update_H()


update_stuff()
print T_MATRIX[5][5][5]
#print constants

【问题讨论】:

  • 以防万一:你能准确描述一下你打算用这样一个矩阵做什么吗?听起来你有一个x-y problem。如果您使用此函数获取索引,然后插入不同的函数,则可能有比解决当前问题(例如卷积)更好的方法。

标签: python numpy matrix 3d


【解决方案1】:

因为这个问题很可能会被放弃或关闭,所以这里有一些内容可能会帮助您思考这个问题。看起来您正在做一些您对计算单元格值与其最近邻居值之间的差异/平均值感兴趣的事情。

在 3D 晶格上,单元格的最近邻位于以下位置(以感兴趣的单元格为中心):

[[[0, 0, 0],
  [0, 1, 0],
  [0, 0, 0]],
 [[0, 1, 0],
  [1, 0, 1],
  [0, 1, 0]],
 [[0, 0, 0],
  [0, 1, 0],
  [0, 0, 0]]]

可以使用 numpy 构建

f = np.zeros((3,3,3))
f[[0,1,1,1,1,2],[1,0,1,1,2,1],[1,1,0,2,1,1]] = 1

这个最近邻滤波器(或内核)的convolution 与任何形状为 (N1,N2,N3) 的 3D 数组 A1 将为您提供一个形状为 (N1,N2,N3) 的新数组 A2,其中每个值A2 中的值是 A1 中相邻值的总和。例如:

>>> A1 = np.arange(27).reshape(3,3,3)
>>> A1
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

>>> A2 = scipy.ndimage.convolve(A1, f)
>>> A2
array([[[ 13,  18,  23],
        [ 28,  33,  38],
        [ 43,  48,  53]],

       [[ 58,  63,  68],
        [ 73,  78,  83],
        [ 88,  93,  98]],

       [[103, 108, 113],
        [118, 123, 128],
        [133, 138, 143]]])

A2 的第一个条目是 13 = 1 + 3 + 9。A2 的中间条目是 78 = 4 + 10 + 12 + 14 + 16 + 22。

您可以使用这些卷积轻松获得您正在寻找的一些数量。看起来H_MATRIX 可以简单地构造为

H_MATRIX = constants * (T_MATRIX - convolve(T_MAXTRIX, f))

使用上面定义的f。或者,您可以定义一个不同的f,其中心为 1,其他 6 个位置为 -1,这可能只给您H_MATRIX = constants * convolve(T_MATRIX, f)

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2013-10-02
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多