我有一个形状为(100,170,256)的numpy数组.我有一个由索引[0,10,20,40,70]组成的数组.
我可以得到与索引对应的子数组,如下所示:
sub_array = array[..., index]
Run Code Online (Sandbox Code Playgroud)
这将返回一个具有预期形状(100,170,5)的数组.现在,我试图获取补充并获得与这些索引不对应的子数组.所以我做了:
sub_array = array[..., ~index]
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这仍然会返回一个形状数组(100,170,5).我想知道如何在python中对这些索引进行补充操作?
[编辑]
还尝试过:
sub_array = array[..., not(index.any)]
Run Code Online (Sandbox Code Playgroud)
然而,这并没有我想要的东西(获得形状的数组(100,170,251).
Luc*_*ucG 11
问题得到了回答,但我在这里提出了三种方法的基准。
最快的解决方案是布尔掩码(具有较小和较大的索引数组大小)
mask = np.ones(arr.size, dtype=bool)
mask[indexes] = False
result = arr[mask]
Run Code Online (Sandbox Code Playgroud)
它比列表理解快 2000 倍,比 np.delete
三种建议的解决方案:列表推导式 ( sol1)、布尔掩码 ( sol2) 或np.delete( sol3)
d = 100000
a = np.random.rand(d)
idx = np.random.randint(d, size = 10)
# list comprehension
def sol1(arr, indexes):
return arr[[i for i in range(arr.size) if i not in indexes]]
sol1(a, idx)
# Out[30]: array([0.13044518, 0.68564961, 0.03033223, ..., 0.03796257, 0.40137137, 0.45403929])
# boolean mask
def sol2(arr, indexes):
mask = np.ones(arr.size, dtype=bool)
mask[indexes] = False
return arr[mask]
sol2(a, idx)
# Out[32]: array([0.13044518, 0.68564961, 0.03033223, ..., 0.03796257, 0.40137137, 0.45403929])
# np.delete
def sol3(arr, indexes):
return np.delete(arr, indexes)
sol3(a, idx)
# Out[36]: array([0.13044518, 0.68564961, 0.03033223, ..., 0.03796257, 0.40137137, 0.45403929])
Run Code Online (Sandbox Code Playgroud)
%timeit sol1(a, idx)
384 ms ± 2.75 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit sol2(a, idx)
154 µs ± 15.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit sol3(a, idx)
194 µs ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
idx = np.random.randint(d, size = 1000)
%timeit sol1(a, idx)
386 ms ± 7.75 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit sol2(a, idx)
171 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit sol3(a, idx)
205 µs ± 10.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)
您拥有数据的方式,最简单的方法是使用np.delete:
sub_array = np.delete(array, index, axis=2)
Run Code Online (Sandbox Code Playgroud)
或者,您尝试使用的逻辑运算符可以应用于布尔数组,如@DSM所示:
mask = np.ones(a.shape[2], dtype=bool)
mask[index] = False
sub_array = array[:,:, mask]
Run Code Online (Sandbox Code Playgroud)
(我不会打电话给你的阵列,array但我跟着你问题中的名字)
看一下〜索引给你的东西 - 我认为它是:
array([ -1, -11, -21, -41, -71])
Run Code Online (Sandbox Code Playgroud)
所以,你的电话
sub_array = array[..., ~index]
Run Code Online (Sandbox Code Playgroud)
将返回5个条目,对应于索引[-1,-11,-21,-41,-71],即255,245,235,215和185,在您的情况下
同样,不是(index.any)给出的
False
Run Code Online (Sandbox Code Playgroud)
因此,为什么你的第二次尝试不起作用
这应该工作:
sub_array = array[..., [i for i in xrange(256) if i not in index]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7384 次 |
| 最近记录: |