我面临一个小问题,以某种方式组合数组。 假设我们有
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]]])
哪个仍然不起作用......
答案 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);
}
}