Python在值的3d数组中查找坐标

Python在值的3d数组中查找坐标,python,arrays,numpy,Python,Arrays,Numpy,我有一个3d数组,我想找到每个元素的坐标值为1。 我使用numpy,这是我的数组: table = np.array([ [ [1,4,8,6], [8]], [ [4], [9], [5]], [ [6], [4]], [ [2], [1]]]) 根据相关问题,我有以下代码: print(np.argwhere(tab

我有一个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]]])
打印(第一个)表格时,结果是:

array([list([[1, 4, 8, 6], [8]]), list([[4], [9], [5]]), list([[6], [4]]),
       list([[2], [1]])], dtype=object)
i、 它是一个一维数组,包含4个列表类型的元素

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

检查元素(列表类型)时,np.where所做的一切 要检查的是:此元素==1。既然不是,那就治疗吧 不匹配。还有其他因素

自2007年7月15日起编辑以下评论 如果将表格定义为:

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]])]))
(所有的列表大小相同),熊猫足够聪明,可以转换 它的目的是:

运行
table.shape
,您将看到
(4,3,4)

然后运行
table.dtype
,您将看到
dtype('int32')
,就是这样 现在是整数的“常规”Numpy数组

在这种情况下,
np.argwhere(表==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-D数组,包含一个单个 对象(嵌套列表)
  • [()]
    是获取唯一包含的对象的方法。您访问 索引中的元素,但索引值是空元组 (没有实际的索引值)
对于您的表,上面的代码打印:

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)]

如果需要,可以根据您的需要对其进行返工。

因为这是一个列表数组,numpy操作无法直接对其进行检查
table.shape,table.dtype
。这可能不是你所期望的,因为子列表没有一个共同的形状。@a_客人,谢谢。有没有一种方法可以通过改变形状来实现我的目标?(比循环更优雅的东西)谢谢,这澄清了一些事情。但是当我修改我的第一个表时,所有4个列表都是相同的长度,列表中的每个元素都是相同的长度:数组([list([[1,4,8,6],[8,0,0,0,0],[0,0,0,0]),列表([[4,0,0,0,0],[9,0,0,0],[5,0,0,0,0]),列表([6,0,0,0],[4,0,0,0,0],[0,0]),0,0]),列表([2,0,0,0,0,0,0,0,0],[1,0,0],[0,0,0],]dtype]``所以我的问题是,我想让np.argwhere处理一个可变的列表大小。或者这是不可能的,我需要用for循环来完成吗?很抱歉“延迟”回答,我最近几天“外出”了。我在最初的回答后面附加了一个如何处理您的案例的建议。
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)]