如何在数组列表中就地删除数组元素

2 投票
1 回答
1042 浏览
提问于 2025-04-17 22:11

我使用了以下这行代码:

list_split_test_array = np.split(test_array, np.where(test_array == 0.)[0])

来把一个数组在每个0的地方分开,0是我之前随便加的一个占位符。
这样我得到了一个数组的列表,其中每个数组的第一个元素(除了第一个数组)都是0。
我想知道怎么能直接在原来的地方删除这些0,得到一个没有占位符0的数组列表。我说“直接在原来的地方”是因为我不想再遍历一遍,把删除了0的每个数组放到一个新的数组列表里。

1 个回答

1

你可以先做一些处理,把零去掉,这里有个例子:

import numpy as np
a = np.random.randint(0, 5, 100)
idx = np.where(a == 0)[0]

np.split(a, idx)

输出结果:

[array([4, 3]),
 array([0, 3, 1, 1]),
 array([0, 4]),
 array([0]),
 array([0, 1, 2, 4]),
 array([0, 4, 2, 2, 3, 1]),
 array([0, 2, 4, 3]),
 array([0, 2, 2, 4]),
 array([0, 3, 2, 1, 2, 4, 1, 2]),
 array([0]),
 array([0]),
 array([0, 1, 3]),
 array([0]),
 array([0, 1, 3, 2, 4]),
 array([0, 3, 3]),
 array([0, 3]),
 array([0, 3, 4, 1, 2, 3, 3, 4, 3, 4, 2, 1]),
 array([0]),
 array([0, 3, 2]),
 array([0]),
 array([0, 4, 1, 4, 2, 3, 1]),
 array([0, 4]),
 array([0]),
 array([0]),
 array([0, 3, 4, 2, 3]),
 array([0, 4, 4, 3, 3, 3, 1]),
 array([0, 2, 4, 1]),
 array([0, 4, 2, 2]),
 array([0])]

把所有的零从 a 中去掉,然后计算新的索引:

idx2 = idx - np.arange(len(idx))
b = np.delete(a, idx)
np.split(b, np.unique(idx2))

这是输出结果:

[array([4, 3]),
 array([3, 1, 1]),
 array([4]),
 array([1, 2, 4]),
 array([4, 2, 2, 3, 1]),
 array([2, 4, 3]),
 array([2, 2, 4]),
 array([3, 2, 1, 2, 4, 1, 2]),
 array([1, 3]),
 array([1, 3, 2, 4]),
 array([3, 3]),
 array([3]),
 array([3, 4, 1, 2, 3, 3, 4, 3, 4, 2, 1]),
 array([3, 2]),
 array([4, 1, 4, 2, 3, 1]),
 array([4]),
 array([3, 4, 2, 3]),
 array([4, 4, 3, 3, 3, 1]),
 array([2, 4, 1]),
 array([4, 2, 2]),
 array([], dtype=float64)]

撰写回答