我有一个3D numpy维数组(737,737,90),它包含float32类型的强度值(即Voxel Intensities)。我的查询是如何创建一个看起来像A = [x-co_ordinate,y-co_ordinate,z-co_ordinate,I(x,y,z)]的数组。
其中I(x,y,z)值是如上所述的数组(737,737,90)。
我尝试了“for”循环方法,但未能获得像[x,y,z,I(x,y,z)]这样的数组。如果您在Python3.5中有任何解决方案,请告诉我。
我试过的方法是
arr =形状数组(737,737,90)由值组成。
表示arr.shape [0]中的x:
for y in arr.shape[1]:
for z in arr.shape[2]:
A[] = [x,y,z, (arr[x,y,z])]
其中arr [x,y,z]是维度(737,737,90)的浮点值数组。
所以我需要像A [x,y,z,arr_value]这样的数组。有什么方法可以在python3.5中执行此操作
此致
拉吉
答案 0 :(得分:0)
你的方法并不差。这些是问题:
A
A = []
for x in range(arr.shape[0]):
for y in range(arr.shape[1]):
for z in range(arr.shape[2]):
A.append([x,y,z, arr[x,y,z]])
A = np.array(A) # convert to array
n_voxels = np.prod(arr.shape)
A = np.vstack([np.unravel_index(np.arange(n_voxels), arr.shape), arr.ravel()]).T
请注意,虽然这是一个很好的开始,但它是一个非常低效的解决方案,因为嵌套for循环在Python中通常很慢。可能更快但不太可读的解决方案可能如下所示:
$scope.openItemEdit = function (item, ev) {
$mdDialog.show({
templateUrl: 'app/item-config.tmpl.html',
parent: angular.element(document.body),
controller: 'ParentController',
controllerAs: 'vm',
targetEvent: ev,
clickOutsideToClose: true,
fullscreen: vm.isCustomFullscreen, // Only for -xs, -sm breakpoints.
locals: {item: item}
})
.then(function () {
$scope.status = 'ok';
}, function () {
$scope.status = 'cancel';
});
};
答案 1 :(得分:0)
一种方法是使用np.indices
获取所有索引,然后将其与输入数组堆叠。输出将采用(4, X, Y, Z)
格式。最后,要以4
列格式获取它,滚动轴以推回第一个轴。
因此,实现将是 -
I = np.indices(arr.shape)
out = np.rollaxis(np.vstack((I,arr[None])),0,4)