use*_*754 6 python arrays numpy coordinates
我想扩展一个我在Stackoverflow上讨论过的问题.它正在处理2D numpy数组,我想用三维数组做同样的事情.
我想将2D数组的元素"移动"到新坐标,这些坐标存储在其他2个数组中.我希望自动化这个,因为实际上我的阵列很大(400x200x100).有些值不会找到他的坐标并且不会被使用,其中一些坐标被屏蔽,我在下面的例子中通过使用值0指示.如果坐标被屏蔽,我想要重新洗牌的数组中的元素将不会使用.
import numpy as np
#My new coordinates in X and Y directions
mx = np.array([[[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.]],
[[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.]]])
my = np.array([[[ 0., 2., 2., 2., 2.],
[ 0., 3., 3., 3., 3.],
[ 0., 4., 4., 4., 4.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]],
[[ 0., 2., 2., 2., 2.],
[ 0., 3., 3., 3., 3.],
[ 0., 4., 4., 4., 4.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]]])
IRtest = np.array([[[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414],
[-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205],
[-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686],
[-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891],
[-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]],
[[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414],
[-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205],
[-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686],
[-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891],
[-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]]])
Run Code Online (Sandbox Code Playgroud)
因此预期的阵列看起来像:
array_expected = np.array([[[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0],
[-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0],
[-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0],
[-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0],
[-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]])
Run Code Online (Sandbox Code Playgroud)
我试着用我上一篇文章得到的代码部分.
b = np.zeros_like(IRtest)
for i in range(IRtest.shape[1]):
for j in range(IRtest.shape[2]):
for k in range(IRtest.shape[0]):
b[k, j, i] = IRtest[k,my[k,j,i],mx[k,j,i]]*(mx[k,j,i]!=-1)*(my[k,j,i]!=-1)
b
Run Code Online (Sandbox Code Playgroud)
但结果与我预期的结果不一样:
array([[[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436],
[-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349],
[-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]],
[[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436],
[-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349],
[-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]]])
Run Code Online (Sandbox Code Playgroud)
您的地图矩阵是错误的,要获得您想要的结果,它们需要像这样(因为,当您将值放入 b 时,您正在检查是否 m[k, j, i] != -1 并且您想要最后一列为 0,不是第一个)
mx = np.array([[[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.]],
[[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.]]])
my = np.array([[[ 2., 2., 2., 2., -1.],
[ 3., 3., 3., 3., -1.],
[ 4., 4., 4., 4., -1.],
[ -1., -1., -1., -1., -1.],
[ -1., -1., -1., -1., -1.]],
[[ 2., 2., 2., 2., -1.],
[ 3., 3., 3., 3., -1.],
[ 4., 4., 4., 4., -1.],
[ -1., -1., -1., -1., -1.],
[ -1., -1., -1., -1., -1.]]])
Run Code Online (Sandbox Code Playgroud)
同样在循环中,最好切换第一个和第二个循环中的尺寸,使它们变成
for i in range(IRtest.shape[2]):
for j in range(IRtest.shape[1]):
for k in range(IRtest.shape[0]):
Run Code Online (Sandbox Code Playgroud)
这对于您在这里给出的情况并不重要,因为矩阵是方形的,但是您提到的矩阵不是方形的真正问题,因此它成为一个问题。