在numpy数组中找到有序向量

时间:2013-10-07 15:06:13

标签: python arrays vector numpy

我需要在numpy.array中找到一个向量。 例如,我有一个名为e的np.array,我想找到e中的向量[1,2](意思是我想在矩阵中有向量的索引)但显然我的程序看到了向量甚至何时不存在:

enter image description here

我用来构建e的代码如下:

import numpy as np
faces = np.array([[1,2,3,4],[5,6,2,1],[6,7,3,2],[7,8,4,3],[8,5,1,4],[8,7,6,5]])
e = np.zeros([6,4,2])
for k in range(len(faces)):
    a = [faces[k][0], faces[k][1]]
    b = [faces[k][1], faces[k][2]] 
    c = [faces[k][2], faces[k][3]]
    d = [faces[k][3], faces[k][0]]
    e[k] = np.array([a,b,c,d])
 print('e: %s' %e)

任何线索如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

尝试:

e[np.all((e-np.array([1,2]))==0, axis=2)]

简要说明。 e-np.array([1,2])会在[0,0]数组[1,2]中返回enp.all(..., axis=2如果True [0,0]则返回布尔数组:False(因此[1,1]之类的内容将变为False)。最后,只需从e切片。

获取[1,2]的索引(可能有多个子向量[1,2]):

np.argwhere(np.all((e-array([1,2]))==0, axis=2))

答案 1 :(得分:3)

不要将Python in与numpy数组一起使用。

e中有6 x 4对。

In [32]: e.shape
Out[32]: (6, 4, 2)

您正在寻找与all()对中的两个(即[1, 2])条目相匹配的元素。

In [33]: (e == np.array([1, 2])).all(-1)
Out[33]: 
array([[ True, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False],
       [False, False, False, False]], dtype=bool)

-1中的all(-1)引用数组中的最后一个维度,即构成对的形状部分。使用-1可能比使用2更通用,在这种情况下也可以使用。

找到了正确的匹配 - 唯一的True值。你可以看到这个结果的形状是有意义的。

In [34]: (e == np.array([1, 2])).all(-1).shape
Out[34]: (6, 4)

要获得第一场比赛的索引,您可以

x, y = (e == np.array([1, 2])).all(-1).argmax(1).argmax(), (e == np.array([1, 2])).all(-1).argmax(0).argmax()

但是在CT中使用np.argwhere建议朱的回答肯定更好。

答案 2 :(得分:2)

您还可以使用以下技巧将您的向量视为np.void dtype的单个项目:

e = np.ascontiguousarray(e)
dt = np.dtype((np.void, e.dtype.itemsize * e.shape[-1]))
e_view = e.view(dt)
search = np.array([1, 2], dtype=e.dtype).view(dt)

您现在可以使用np.in1d提取职位:

mask = np.in1d(e_view, search)
indices = np.unravel_index(np.where(mask), e.shape[:-1])

>>> indices
(array([[0]], dtype=int64), array([[0]], dtype=int64))

返回数组是一个元组,其中search出现的行和列,在这种情况下只有一个,(0, 0)

答案 3 :(得分:0)

这将打印出e的所有索引以及它是否等于[1,2]。如果您想要返回索引而不是打印索引,可以将(num, num2)添加到另一个列表,这样就可以为[1,2]提供所有位置。需要扩展到使用更多级别的数组。

for num, item in enumerate(e):
    for num2, item2 in enumerate(item):                                    
        print ('e[{i}][{j}]: {truth}'.format(i=num, 
                                             j=num2, 
                                             truth = (item2 == [1,2]).all()))

输出:

e[0][0]: True                                                                                                          
e[0][1]: False                                                                                                         
e[0][2]: False                                                                                                         
e[0][3]: False                                                                                                         
e[1][0]: False                                                                                                         
e[1][1]: False                                                                                                         
e[1][2]: False                                                                                                         
e[1][3]: False                                                                                                         
e[2][0]: False                                                                                                         
e[2][1]: False                                                                                                         
e[2][2]: False                                                                                                         
e[2][3]: False                                                                                                         
e[3][0]: False                                                                                                         
e[3][1]: False                                                                                                         
e[3][2]: False                                                                                                         
e[3][3]: False                                                                                                         
e[4][0]: False                                                                                                         
e[4][1]: False                                                                                                         
e[4][2]: False                                                                                                         
e[4][3]: False                                                                                                         
e[5][0]: False                                                                                                         
e[5][1]: False                                                                                                         
e[5][2]: False                                                                                                         
e[5][3]: False