Python在值的3d数组中查找坐标
我有一个3d数组,我想找到每个元素的坐标值为1。 我使用numpy,这是我的数组: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
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)]