为了账号安全,请及时绑定邮箱和手机立即绑定

Python find coordinates in 3d array of a value

Python find coordinates in 3d array of a value

人到中年有点甜 2023-03-08 10:57:48
我有一个 3d 数组,我想找到值为 1 的每个元素的坐标。我使用 numpy,这是我的数组:table = np.array([    [        [1,4,8,6],        [8]],    [        [4],        [9],        [5]],    [        [6],        [4]],    [        [2],        [1]]])基于这个相关问题,我有以下代码:print(np.argwhere(table == 1))对于“更简单”的 3d 数组,此代码完全符合我的要求(打印值出现的 3d 坐标)。但不适用于我的阵列。为什么我当前的代码不适用于我的数组?如何在我的阵列上获得相同的结果?它正在处理的数组:table = np.array([    [        [ 1, 2, 3],        [ 8, 4, 11]],    [           [ 1, 4, 4],        [ 8, 5, 9]],    [        [ 3, 8, 6],        [ 11, 9, 8]],    [           [ 3, 7, 6],        [ 9, 3, 7]]])
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

当您打印(第一个)表时,结果是:


array([list([[1, 4, 8, 6], [8]]), list([[4], [9], [5]]), list([[6], [4]]),

       list([[2], [1]])], dtype=object)

即它是一个一维数组,包含4个列表类型的元素。


np.where找不到1实例的原因是它查看每个元素并将其与给定值进行比较。此函数在检查数组的特定元素时不会“潜入”此对象(不检查元素的各个子元素(如果它是列表))。


np.where在检查一个元素(列表类型)时所做的所有事情是检查:这个元素是否 == 1。既然不是,那么它就被视为不匹配。其他元素也是。


根据 15.07 的评论进行编辑

如果您将表定义为:


table2 = np.array(list([

    list([[1,4,8,6], [8,0,0,0], [0,0,0,0]]),

    list([[4,0,0,0], [9,0,0,0], [5,0,0,0]]),

    list([[6,0,0,0], [4,0,0,0], [0,0,0,0]]),

    list([[2,0,0,0], [1,0,0,0], [0,0,0,0]])]))

(所有列表的大小相同),Pandas足够聪明,可以将其转换为:


array([[[1, 4, 8, 6],

        [8, 0, 0, 0],

        [0, 0, 0, 0]],


       [[4, 0, 0, 0],

        [9, 0, 0, 0],

        [5, 0, 0, 0]],


       [[6, 0, 0, 0],

        [4, 0, 0, 0],

        [0, 0, 0, 0]],


       [[2, 0, 0, 0],

        [1, 0, 0, 0],

        [0, 0, 0, 0]]])

运行table.shape,你会看到(4, 3, 4)。


然后运行table.dtype,你会看到dtype('int32'),所以它现在是一个“常规”的Numpy int数组。


在这种情况下,np.argwhere(table == 1)找到仅包含1的单元格的索引。


但是你的桌子是如此“奇怪”的情况,熊猫不是为它设计的。


要在这些(嵌套的)列表中找到每个1的索引,您可以遍历数组(使用nd.iter)并在每个元素内部查找1的索引(如果有)。就像是:


it = np.nditer(table, flags=['f_index', 'refs_ok'])

for x in it:

    print(f'Index {it.index}: {x}')

    res = [(i, el.index(1)) for i, el in enumerate(x[()]) if 1 in el]

    if len(res) == 0:

        print('    Nothing found')

    else:

        print(f'    Found at: {res}')

请注意,在x之后有一些奇怪的结构,即[()]。原因是:


您的表是对象的一维数组。

每个元素实际上是一个0 维数组,包含单个 对象(嵌套列表)。

[()]是获取唯一包含对象的方法。您通过 index访问元素,但索引值是一个空元组 (没有实际的索引值)。

对于您的表格,上面的代码打印:


Index 0: [[1, 4, 8, 6], [8]]

    Found at: [(0, 0)]

Index 1: [[4], [9], [5]]

    Nothing found

Index 2: [[6], [4]]

    Nothing found

Index 3: [[2], [1]]

    Found at: [(1, 0)]

如果需要,请对其进行返工以满足您的需要。


查看完整回答
反对 回复 2023-03-08
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信