Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中修改3D数组_Python_Arrays_List_Numpy - Fatal编程技术网

在Python中修改3D数组

在Python中修改3D数组,python,arrays,list,numpy,Python,Arrays,List,Numpy,我试图在python中对3d数组中的特定元素执行操作。以下是该阵列的一个示例: [[[ 0.5 0.5 50. ] [ 50.5 50.5 100. ] [ 0.5 100.5 50. ] [ 135. 90. 45. ]] [[ 50.5 50.5 100. ] [ 100.

我试图在python中对3d数组中的特定元素执行操作。以下是该阵列的一个示例:

[[[   0.5         0.5        50.      ]
  [  50.5        50.5       100.      ]
  [   0.5       100.5        50.      ]
  [ 135.         90.         45.      ]]

 [[  50.5        50.5       100.      ]
  [ 100.5         0.5        50.      ]
  [ 100.5       100.5        50.      ]
  [  45.         90.         45.      ]]

 [[ 100.5       100.5        50.      ]
  [ 100.5       100.5         0.      ]
  [   0.5       100.5        50.      ]
  [  90.          0.         90.      ]]
我需要的一个例子是取数组中的三个值,即0.5、0.5、50。从第四排取第一个元素,即135。并将这四个元素发送到一个函数中。然后,函数返回需要放入数组的3个元素的新值

我对python很陌生,所以很难让它正常工作。我应该做一个循环吗?还是别的什么

谢谢 尼克

解决方案的尝试:

b = shape(a)
triangles = b[0]

for k in range(0,triangles):
    for i in range(0,2):
        a[k,i,:] = VectMath.rotate_x(a[k,i,0],a[k,i,1],a[k,i,2],a[k,3,2])

您可以使用
VectMath.rotate\u x
函数旋转向量数组,然后使用slice获取并将数据放入
a

a = np.array(
[[[   0.5,         0.5,       50.,      ],
  [  50.5,        50.5,      100.,      ],
  [   0.5,       100.5,       50.,      ],
  [ 135. ,        90. ,       45.,      ]],
 [[  50.5,        50.5,      100.,      ],
  [ 100.5,         0.5,       50.,      ],
  [ 100.5,       100.5,       50.,      ],
  [  45. ,        90. ,       45.,      ]],
 [[ 100.5,       100.5,       50.,      ],
  [ 100.5,       100.5,        0.,      ],
  [   0.5,       100.5,       50.,      ],
  [  90. ,         0. ,       90.,      ]]])

def rotate_x(v, deg):
    r = np.deg2rad(deg)
    c = np.cos(r)
    s = np.sin(r)
    m = np.array([[1, 0, 0],
                  [0, c,-s],
                  [0, s, c]])
    return np.dot(m, v)

vectors = a[:, :-1, :]
angles = a[:, -1, 0]

for i, (vec, angle) in enumerate(zip(vectors, angles)):
    vec_rx = rotate_x(vec.T, angle).T
    a[i, :-1, :] = vec_rx

print a 
输出:

[[[  5.00000000e-01  -3.57088924e+01  -3.50017857e+01]
  [  5.05000000e+01  -1.06419571e+02  -3.50017857e+01]
  [  5.00000000e-01  -1.06419571e+02   3.57088924e+01]
  [  1.35000000e+02   9.00000000e+01   4.50000000e+01]]

 [[  5.05000000e+01  -3.50017857e+01   1.06419571e+02]
  [  1.00500000e+02  -3.50017857e+01   3.57088924e+01]
  [  1.00500000e+02   3.57088924e+01   1.06419571e+02]
  [  4.50000000e+01   9.00000000e+01   4.50000000e+01]]

 [[  1.00500000e+02  -5.00000000e+01   1.00500000e+02]
  [  1.00500000e+02   6.15385017e-15   1.00500000e+02]
  [  5.00000000e-01  -5.00000000e+01   1.00500000e+02]
  [  9.00000000e+01   0.00000000e+00   9.00000000e+01]]]
如果有很多三角形,如果我们可以在不使用python for循环的情况下旋转所有向量,速度可能会更快

在这里,我通过展开矩阵乘积进行旋转计算:

x' = x
y' = cos(t)*y - sin(t)*z
z' = sin(t)*y + cos(t)*z
因此,我们可以将这些公式矢量化:

a2 = np.array(
[[[   0.5,         0.5,       50.,      ],
  [  50.5,        50.5,      100.,      ],
  [   0.5,       100.5,       50.,      ],
  [ 135. ,        90. ,       45.,      ]],
 [[  50.5,        50.5,      100.,      ],
  [ 100.5,         0.5,       50.,      ],
  [ 100.5,       100.5,       50.,      ],
  [  45. ,        90. ,       45.,      ]],
 [[ 100.5,       100.5,       50.,      ],
  [ 100.5,       100.5,        0.,      ],
  [   0.5,       100.5,       50.,      ],
  [  90. ,         0. ,       90.,      ]]])

vectors = a2[:, :-1, :]
angles = a2[:, -1:, 0]

def rotate_x_batch(vectors, angles):
    rad = np.deg2rad(angles)
    c = np.cos(rad)
    s = np.sin(rad)
    x = vectors[:, :, 0]
    y = vectors[:, :, 1]
    z = vectors[:, :, 2]
    yr = c*y - s*z
    zr = s*y + c*z
    vectors[:, :, 1] = yr
    vectors[:, :, 2] = zr

rotate_x_batch(vectors, angles)
print np.allclose(a, a2)

您可以使用
VectMath.rotate\u x
函数旋转向量数组,然后使用slice获取并将数据放入
a

a = np.array(
[[[   0.5,         0.5,       50.,      ],
  [  50.5,        50.5,      100.,      ],
  [   0.5,       100.5,       50.,      ],
  [ 135. ,        90. ,       45.,      ]],
 [[  50.5,        50.5,      100.,      ],
  [ 100.5,         0.5,       50.,      ],
  [ 100.5,       100.5,       50.,      ],
  [  45. ,        90. ,       45.,      ]],
 [[ 100.5,       100.5,       50.,      ],
  [ 100.5,       100.5,        0.,      ],
  [   0.5,       100.5,       50.,      ],
  [  90. ,         0. ,       90.,      ]]])

def rotate_x(v, deg):
    r = np.deg2rad(deg)
    c = np.cos(r)
    s = np.sin(r)
    m = np.array([[1, 0, 0],
                  [0, c,-s],
                  [0, s, c]])
    return np.dot(m, v)

vectors = a[:, :-1, :]
angles = a[:, -1, 0]

for i, (vec, angle) in enumerate(zip(vectors, angles)):
    vec_rx = rotate_x(vec.T, angle).T
    a[i, :-1, :] = vec_rx

print a 
输出:

[[[  5.00000000e-01  -3.57088924e+01  -3.50017857e+01]
  [  5.05000000e+01  -1.06419571e+02  -3.50017857e+01]
  [  5.00000000e-01  -1.06419571e+02   3.57088924e+01]
  [  1.35000000e+02   9.00000000e+01   4.50000000e+01]]

 [[  5.05000000e+01  -3.50017857e+01   1.06419571e+02]
  [  1.00500000e+02  -3.50017857e+01   3.57088924e+01]
  [  1.00500000e+02   3.57088924e+01   1.06419571e+02]
  [  4.50000000e+01   9.00000000e+01   4.50000000e+01]]

 [[  1.00500000e+02  -5.00000000e+01   1.00500000e+02]
  [  1.00500000e+02   6.15385017e-15   1.00500000e+02]
  [  5.00000000e-01  -5.00000000e+01   1.00500000e+02]
  [  9.00000000e+01   0.00000000e+00   9.00000000e+01]]]
如果有很多三角形,如果我们可以在不使用python for循环的情况下旋转所有向量,速度可能会更快

在这里,我通过展开矩阵乘积进行旋转计算:

x' = x
y' = cos(t)*y - sin(t)*z
z' = sin(t)*y + cos(t)*z
因此,我们可以将这些公式矢量化:

a2 = np.array(
[[[   0.5,         0.5,       50.,      ],
  [  50.5,        50.5,      100.,      ],
  [   0.5,       100.5,       50.,      ],
  [ 135. ,        90. ,       45.,      ]],
 [[  50.5,        50.5,      100.,      ],
  [ 100.5,         0.5,       50.,      ],
  [ 100.5,       100.5,       50.,      ],
  [  45. ,        90. ,       45.,      ]],
 [[ 100.5,       100.5,       50.,      ],
  [ 100.5,       100.5,        0.,      ],
  [   0.5,       100.5,       50.,      ],
  [  90. ,         0. ,       90.,      ]]])

vectors = a2[:, :-1, :]
angles = a2[:, -1:, 0]

def rotate_x_batch(vectors, angles):
    rad = np.deg2rad(angles)
    c = np.cos(rad)
    s = np.sin(rad)
    x = vectors[:, :, 0]
    y = vectors[:, :, 1]
    z = vectors[:, :, 2]
    yr = c*y - s*z
    zr = s*y + c*z
    vectors[:, :, 1] = yr
    vectors[:, :, 2] = zr

rotate_x_batch(vectors, angles)
print np.allclose(a, a2)

您尝试的解决方案看起来不错。它有效吗?到目前为止,我只是不知道这是否是最好的方法。如果它有效,我会保留你所拥有的,因为你了解它。如果您确实发现性能是一个问题,那么您可能会发现使用numpy会有所帮助(例如,您可以将所有三角形旋转成一条直线,而不是在其上循环)。您尝试的解决方案看起来不错。它有效吗?到目前为止,我只是不知道这是否是最好的方法。如果它有效,我会保留你所拥有的,因为你了解它。如果您确实发现性能是一个问题,那么您可能会发现使用numpy会有所帮助(例如,您可以将所有三角形旋转成一行,而不是在它们上循环)。