我有一个3D阵列:
array([[[ 0.61795117, 0.34560273],
[ 0.60095554, 0.313913 ],
[ 0.56190875, 0.27450137],
[ 0.53021642, 0.26212656],
[ 0.49034335, 0.25858353],
[ 0.44450648, 0.26146402],
[ 0.41882064, 0.26448245],
[ 0.39206795, 0.26703482],
[ 0.37275912, 0.27370546]],
[[ 0.62495791, 0.3120504 ],
[ 0.60739456, 0.2823137 ],
[ 0.58004256, 0.25910831],
[ 0.54361132, 0.25084742],
[ 0.49346121, 0.24739456],
[ 0.44806806, 0.24990211],
[ 0.40776521, 0.25205095],
[ 0.37056546, 0.256433 ],
[ 0.34548124, 0.26043473]],
[[ 0.65452639, 0.26129899],
[ 0.62969364, 0.25388184],
[ 0.59575798, 0.24279791],
[ 0.56249134, 0.23879938],
[ 0.50719102, 0.23659991],
[ 0.4391442 , 0.23682689],
[ 0.39447801, 0.23831357],
[ 0.35186027, 0.24433696],
[ 0.31920393, 0.25020494]]])
我有一个索引列表:
[(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
我正在尝试删除每个元组指向的3D数组中的行。
我试过,但不成功
np.delete(array, indexes, axis=0)
有什么建议吗?
答案 0 :(得分:2)
可能不是最漂亮的解决方案,但您可以使用布尔索引(即,如果这些列表的形状与您显示的相似)。我明确假设您要删除的元素对应于此处大小为2的子数组,然后:
indices = [(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
ind = np.array(indices)
idx = np.ones(arr.shape[0:2],dtype= bool) # here I assume the shape
idx[ind[:,0],ind[:,1]] = False
print(arr[idx])
将打印您想要的数组
修改强> 主要的问题是,即使有一个很好的面具,如
indices = [(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(0, 7),(0, 8),(1, 0),(1, 3),(1, 6),(2, 0),(1, 1)]
im,jm = zip(*indices)
idx = np.ones_like(arr,dtype=bool)
idx[im,jm] = False
"行数"你想要取出的第一个维度的不同条目各不相同。起初你的数组是维度(3,7,2)。然后,沿着第一个维度,您想要为所有3个子阵列删除不同数量的行,因此您不能将其重塑为类似形状的东西(如(3,5,2)或其他)。这也是尝试在这里使用删除的主要问题,我相信。所以即使你申请:
newarr = arr[idx]
数组将包含您想要的元素,但将被展平。如果你可以制定一个正确的整形规则,例如你总是知道最里面的数组的大小(那些将被删除的那些),在这种情况下是2,你可以使用掩码并做
newarr = arr[idx].reshape(-1,2)
获得更通用的解决方案
答案 1 :(得分:0)
为什么不首先将数组arr
转换为列表,然后删除元素:
a=arr.tolist()
for i in indexes:
x,y=i
del(a[x][y])