从嵌套的numpy数组中删除包含某个值的numpy数组

noj0wjuj  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(110)

我有一个numpy数组,它是一个一维数组的一维数组的零维数组。它看起来像这样:
第一个月
我试图过滤掉所有包含值2的零维数组,所以所有的[2]都应该被删除。问题是我需要保持数组的整体结构不变。结果应该是这样的:
arr = [([[1], [0], [0]]), ([[0]]), ([0], [1]])]
我会很感激任何帮助!我也想知道是否有好的方法来查看一个.npy文件或检查作为原始数组打印超级丑陋,我不能想出一个好办法来查看这个文件在CLI.谢谢!
我是numpy的新手,我不能让它与一般的numpy过滤函数一起工作,比如:
np.where()arr = arr[cond(arr)]
可能是因为嵌套结构
我尝试使用for循环,但无法将结果转换为原始数组

mask = (arr[0] != [2])
result = []
for i in arr:
    filtered_arr = arr[0][mask]
    result.append(filtered_arr)

result = np.array(result, dtype=object)`

字符串
这将输出一个类似于以下的数组:
[([1, 0, 0]), ([0]), ([0, 1])]
这几乎是我想要的,但不完全是

wa7juj8i

wa7juj8i1#

您当前的arr是由不同形状的 numpy 数组组成的容器/列表,如[[(534, 1), (426, 1), (502, 1), (602, 1), (190, 1), (458, 1) ....](使用print([a.shape for a in arr])检查)。更改数组的形状,使其成为1行x多列,可以将您从垂直冗长的数组视图中释放出来,并切换到更紧凑的宽视图。
但如果不允许更改形状,请过滤出列值为2的行,如下所示:

arr = np.load(npy_file_path, allow_pickle=True)
# print([a.shape for a in arr])
arr = np.array([a[a[:, 0] != 2] for a in arr], dtype='O')

字符串

ctzwtxfj

ctzwtxfj2#

当加载文件并使用allow_pickle加载时,我看到一个包含34个元素的对象dtype数组:

In [60]: arr.shape, arr.dtype
Out[60]: ((34,), dtype('O'))

字符串
看起来所有元素本身都是int dtype数组,具有不同的(n,1)形状:

In [61]: arr[0].shape, arr[0].dtype
Out[61]: ((534, 1), dtype('int32'))

In [62]: arr[1].shape, arr[1].dtype
Out[62]: ((426, 1), dtype('int32'))


实际上,它是一个2d数组列表。

In [63]: np.array([i.shape[0] for i in arr])
Out[63]: 
array([534, 426, 502, 602, 190, 458, 360, 470, 500, 645, 537, 484, 472,
       492, 414, 475, 242, 314, 250, 184, 174, 335, 437, 482, 147, 108,
       306, 456, 668, 269, 562, 377, 647, 558])


每个数组必须单独处理。要查找arr[0]中不包含2的所有元素:

In [65]: arr[0][arr[0]!=2].shape
Out[65]: (518,)


或者注意在第二个调光时进行遮罩:

In [70]: arr[0][arr[0][:,0]!=2].shape
Out[70]: (518, 1)


像这样的数组是很笨拙的,因为每个数字都在单独的一行上。
未筛选和已筛选数组的最后20行:

In [80]: arr[0][-20:,0]
Out[80]: array([0, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 2])

In [81]: arr[0][arr[0][:,0]!=2][-20:,0]
Out[81]: array([1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0])


数组的过滤形状:

In [85]: np.array([i[i[:,0]!=2].shape[0] for i in arr])
Out[85]: 
array([518, 375, 407, 523, 137, 407, 323, 380, 452, 493, 470, 355, 379,
       443, 362, 449, 220, 273, 246, 161, 134, 304, 386, 412, 147, 108,
       284, 397, 590, 269, 523, 341, 603, 538])

相关问题