在Python中从3D numpy数组创建一个4列数组
我有一个维度的3D numpy数组(737737,90),其中包含float32类型的强度值(即体素强度)。我的问题是如何制作一个看起来像a=[x坐标,y坐标,z坐标,i(x,y,z)]的数组 其中I(x,y,z)值是已知的上述数组(737737,90) 我尝试了“for”循环方法,但没有得到像[x,y,z,I(x,y,z)]这样的数组。如果您在Python3.5中对此有任何解决方案,请务必让我知道 我尝试的方法是 arr=形状数组(737737,90)由值组成 对于阵列形状[0]中的x:在Python中从3D numpy数组创建一个4列数组,python,numpy,Python,Numpy,我有一个维度的3D numpy数组(737737,90),其中包含float32类型的强度值(即体素强度)。我的问题是如何制作一个看起来像a=[x坐标,y坐标,z坐标,i(x,y,z)]的数组 其中I(x,y,z)值是已知的上述数组(737737,90) 我尝试了“for”循环方法,但没有得到像[x,y,z,I(x,y,z)]这样的数组。如果您在Python3.5中对此有任何解决方案,请务必让我知道 我尝试的方法是 arr=形状数组(737737,90)由值组成 对于阵列形状[0]中的x: fo
for y in arr.shape[1]:
for z in arr.shape[2]:
A[] = [x,y,z, (arr[x,y,z])]
其中,arr[x,y,z]是维度(737737,90)的浮点值数组
所以我需要像[x,y,z,arr_值]这样的数组。在python3.5中有什么方法可以做到这一点吗
问候,
拉吉你的方法不错。这些问题是:
- 你忘了绕X
- 要在一个值范围内循环,需要使用
range
- 在循环中使用前,需要初始化
A
n_voxels = np.prod(arr.shape)
A = np.vstack([np.unravel_index(np.arange(n_voxels), arr.shape), arr.ravel()]).T
一种方法是获取所有这些索引,然后将其与输入数组叠加。输出将采用
(4,X,Y,Z)
格式。最后,要将其设置为4
columns格式,请滚动轴以向后推第一个轴
因此,将需要实施-
I = np.indices(arr.shape)
out = np.rollaxis(np.vstack((I,arr[None])),0,4)
你好!有许多解决方案可以解决您的问题。你能澄清一下你所说的“循环法”是什么意思吗?最好在一个最小且自包含的示例中发布代码。那么我相信有人会告诉你哪里出了问题,以及如何纠正谢谢你的回复。我已经编辑了查询。谢谢你的回答。但有一件事我没有得到,当我检查输出时,假设我检查访问随机索引,如[200200,30],它应该给我一个值,对应于x,y,z索引,但它显示了4个值。为什么?如果您让我知道,这会很有帮助。@Rajubai您在问题中列出了您想要的
A
,例如A:[x,y,z,arr\u值]
,我假设为4D数组。因此,当您使用out[200200,30]
索引到它的前三个轴时,这与out[200200,30,:]
相同,您将得到与4列对应的所有4个元素。为什么您希望[200,200,30]输出是一个值?如果您希望得到一个值,那么您可能希望通过arr[200200,30]
从输入数组本身获取该值?
I = np.indices(arr.shape)
out = np.rollaxis(np.vstack((I,arr[None])),0,4)