结合numpy多维数组

时间:2013-11-13 16:30:29

标签: python arrays numpy

我面临一个小问题,以某种方式组合数组。 假设我们有

a=array([[1,1,1],[2,2,2],[3,3,3]])

b=array([[10,10,10],[20,20,20],[30,30,30]])

我希望得到

c=array([[[1,1,1],[10,10,10]],[[2,2,2],[20,20,20]],[[3,3,3],[30,30,30]]])

真正的问题是我的数组a和b比3个坐标长得多!

使用concatenate实现的最佳效果是:

concatenate((a,b),axis=2)

导致

array([[ 1, 1, 1, 10, 10, 10], [ 2, 2, 2, 20, 20, 20], [ 3, 3, 3, 30, 30, 30]])

它非常好,但没有足够的深度。

另外,我尝试过另一个问题来获得所需的深度:

d=concatenate((a[...,None],b[...,None]),axis=2)

但结果是:

 array([[[ 1, 10],
    [ 1, 10],
    [ 1, 10]],

   [[ 2, 20],
    [ 2, 20],
    [ 2, 20]],

   [[ 3, 30],
    [ 3, 30],
    [ 3, 30]]])

哪个仍然不起作用......

3 个答案:

答案 0 :(得分:6)

zip(a,b)

不是你想要的?

>>> a=array([[1,1,1],[2,2,2],[3,3,3]]);b=array([[10,10,10],[20,20,20],[30,30,30]
>>> zip(a,b)
[(array([1, 1, 1]), array([10, 10, 10])), (array([2, 2, 2]), array([20, 20, 20])), (array([3, 3, 3]), array([30, 30, 30]))]

答案 1 :(得分:5)

好像你想要在0和1之间添加一个新轴,所以把None放在中间。这将使轴1移动到轴2并在1处创建新尺寸。如此:

a = array([[1,1,1],[2,2,2],[3,3,3]])
b = array([[10,10,10],[20,20,20],[30,30,30]])
c = concatenate((a[:, None, :], b[:, None, :]), axis=1)

>>> c
array([[[ 1,  1,  1],
    [10, 10, 10]],

   [[ 2,  2,  2],
    [20, 20, 20]],

   [[ 3,  3,  3],
    [30, 30, 30]]])

答案 2 :(得分:1)

您正在寻找stack。它用于沿新轴连接阵列;与'numpy.concatenate'形成对比,后者用于沿现有轴连接数组。使用a = array([[1,1,1],[2,2,2],[3,3,3]]) b = array([[10,10,10],[20,20,20],[30,30,30]]) c = stack((a, b), axis=1) >>> c array([[[ 1, 1, 1], [10, 10, 10]], [[ 2, 2, 2], [20, 20, 20]], [[ 3, 3, 3], [30, 30, 30]]]) ,您可以指定要在堆叠之后的轴所连接的轴;所以你要指定轴1。

public String getCamerPath(Context context) {
        SharedPreferences prefs = context.getSharedPreferences("setCamerPath", 0);
        String value = prefs.getString("getCamerPath", "");

        return value;

    }

    public void setCamerPath(Context context, String value)

    {
        SharedPreferences prefs = context.getSharedPreferences("setCamerPath", 0);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("getCamerPath", value);
        editor.commit();
    }

Uri outputFileUri = Uri.fromFile(newFile);

setCamerPath(this, outputFileUri.getPath());
            Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            startActivityForResult(cameraIntent, CAMERA_REQUEST);


@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_SELECT_PICTURE || requestCode == CAMERA_REQUEST) {

                    startCropActivity(getCamerPath(this));

            } else if (requestCode == UCrop.REQUEST_CROP) {
                handleCropResult(data);
            }
        }
        if (resultCode == UCrop.RESULT_ERROR) {
            handleCropError(data);
        }
    }