从Python中的3D numpy数组创建一个4列数组

时间:2017-01-11 14:42:47

标签: python numpy

我有一个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中执行此操作

此致

拉​​吉

2 个答案:

答案 0 :(得分:0)

你的方法并不差。这些是问题:

  • 你忘了绕过X
  • 要循环使用一系列值,您需要使用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)