Python中多维数组的非连续切片
我正在尝试对这样的多维数组执行非连续切片(Matlab peudo代码) 但当我尝试用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)来索引同一数组的不同维度,则它们必须广播。这是为了使索引功能更加强大而设计
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。上面的代码我错了。这两个索引向量的长度不同。