Python中多维数组使用argsort函数时的索引错误问题
解决numpy argsort时的索引错误问题
咱们先拆解下你遇到的问题:你原本以为I2是个三维数组,结果numpy悄悄把它变成了一维的object数组,这才导致索引报错。
问题根源
你定义I2的时候,放了两个长度不一样的子数组(第一个有10个元素,第二个只有8个)。numpy对规则数组要求很高,当子数组长度不一致时,它没法创建规整的三维数组,只能把I2变成shape=(2,)的一维数组——数组里的每个元素都是独立的二维数组(I2[0]是(10,2),I2[1]是(8,2))。
所以当你写I2[0,:, 1]时,相当于给一个一维数组的元素(已经是二维数组了)用了三个索引维度,这不就超出范围了嘛,自然报IndexError。
两种解决方案
根据你的实际需求选就行:
方案1:创建规整的三维数组
如果你的两个子数组应该长度相同,那补全第二个子数组的元素,让它和第一个长度一致,这样numpy就会生成(2,10,2)的三维数组,原代码就能正常跑:
import numpy as np # 补全第二个子数组的元素,这里随便加了两个示例值 I2=np.array([[[0, 1], [0, 3], [1, 2], [1, 4], [2, 5], [3, 4], [3, 6], [4, 7], [5, 4], [6, 7]], [[0, 1], [0, 3], [1, 2], [1, 4], [2, 5], [3, 4], [3, 6], [4, 7], [5, 6], [6, 8]]]) order2 = I2[0,:, 1].argsort() print("order2 =",[order2])
方案2:保留不同长度的子数组(处理object数组)
如果确实要保留不同长度的子数组,那调整索引方式,直接访问I2[0]这个二维数组再操作:
import numpy as np # 显式指定dtype=object,避免numpy自动转换时的歧义 I2=np.array([[[0, 1], [0, 3], [1, 2], [1, 4], [2, 5], [3, 4], [3, 6], [4, 7], [5, 4], [6, 7]], [[0, 1], [0, 3], [1, 2], [1, 4], [2, 5], [3, 4], [3, 6], [4, 7]]], dtype=object) # 先取I2[0]这个二维数组,再取第二列排序 order2 = I2[0][:, 1].argsort() print("order2 =",[order2])
验证效果
两种方案运行后,都能得到和order1类似的排序索引结果,不会再出现索引错误啦。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

