Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中多维数组的非连续切片_Python_Matlab_Numpy - Fatal编程技术网

Python中多维数组的非连续切片

Python中多维数组的非连续切片,python,matlab,numpy,Python,Matlab,Numpy,我正在尝试对这样的多维数组执行非连续切片(Matlab peudo代码) 但当我尝试用Python编写此代码时: A = B[:,:,np.array([0,2]),np.array([1,3,5])] #A and B are two 4D arrays 它给出了一个错误:索引器错误:形状不匹配:无法广播索引数组 需要注意的是,每次只对一个维度进行切片就可以了 在numpy中,如果您同时使用多个花式索引(即array)来索引同一数组的不同维度,则它们必须广播。这是为了使索引功能更加强大而设计

我正在尝试对这样的多维数组执行非连续切片(Matlab peudo代码)

但当我尝试用Python编写此代码时:

A = B[:,:,np.array([0,2]),np.array([1,3,5])] #A and B are two 4D arrays
它给出了一个错误:索引器错误:形状不匹配:无法广播索引数组


需要注意的是,每次只对一个维度进行切片就可以了

numpy
中,如果您同时使用多个花式索引(即
array
)来索引同一数组的不同维度,则它们必须广播。这是为了使索引功能更加强大而设计的。对于您的情况,解决问题的最简单方法是索引两次:

B[:, :, [0,2]] [..., [1,3,5]]
其中,
代表尽可能多的

这种方法索引两次会产生额外的数据移动时间。如果您只想索引一次,请确保它们广播(即,在不同维度上放置花哨的索引):

这将产生一个
X×Y×2×3
数组。另一方面,你也可以这样做

B[:, :, [0,2], np.array([1,3,5])[:,None]]
这将产生一个
X×Y×3×2
数组。
[1,3,5]
轴在
[0,2]
轴之前进行换位

如果您不需要对它进行奇特的操作,就不必使用
np.array([0,2])
。简单地
[0,2]
就可以了


np.array([0,2])[:,None]
相当于
[[0],[2]]]
,其中
[:,None]
的要点是创建一个额外的维度,使形状成为
(2,1)
。形状
(2,)
(3,)
不能广播,而形状
(2,1)
(3,)
可以,在
numpy
中变成
(2,3)
,如果您同时使用多个花式索引(即
数组
)来索引同一数组的不同维度,它们必须广播。这是为了使索引功能更加强大而设计的。对于您的情况,解决问题的最简单方法是索引两次:

B[:, :, [0,2]] [..., [1,3,5]]
其中,
代表尽可能多的

这种方法索引两次会产生额外的数据移动时间。如果您只想索引一次,请确保它们广播(即,在不同维度上放置花哨的索引):

这将产生一个
X×Y×2×3
数组。另一方面,你也可以这样做

B[:, :, [0,2], np.array([1,3,5])[:,None]]
这将产生一个
X×Y×3×2
数组。
[1,3,5]
轴在
[0,2]
轴之前进行换位

如果您不需要对它进行奇特的操作,就不必使用
np.array([0,2])
。简单地
[0,2]
就可以了


np.array([0,2])[:,None]
相当于
[[0],[2]]]
,其中
[:,None]
的要点是创建一个额外的维度,使形状成为
(2,1)
。形状
(2,)
(3,)
不能广播,而形状
(2,1)
(3,)
可以,这就变成了
(2,3)

你的问题中应该包括
A
B
,以及你的预期输出B是什么?列表还是numpy数组?那段代码不能给你那个错误。唯一的索引数组是
np.array([0,2])
np.array([1,3])
,它们可以一起广播,它不会像在matlab中那样做,索引是关闭的,但不应该给你那个错误。请提出一个正确的解决方案并运行它,以检查它是否再现了您的问题。您需要
np.ix\uu
。前一个答案的投票结果显示了如何使用它。也不要忘记,虽然MATLAB索引是基于1的,但numpy索引是基于0的。@AndrasDeak。上面的代码我错了。这两个索引向量的长度不同。您应该在问题中包括
A
B
,以及您的预期输出B是什么?列表还是numpy数组?那段代码不能给你那个错误。唯一的索引数组是
np.array([0,2])
np.array([1,3])
,它们可以一起广播,它不会像在matlab中那样做,索引是关闭的,但不应该给你那个错误。请提出一个正确的解决方案并运行它,以检查它是否再现了您的问题。您需要
np.ix\uu
。前一个答案的投票结果显示了如何使用它。也不要忘记,虽然MATLAB索引是基于1的,但numpy索引是基于0的。@AndrasDeak。上面的代码我错了。这两个索引向量的长度不同。