5

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

在此处输入图像描述

我用来构建 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

4 回答 4

6

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

中有 6 x 4 对e

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

您正在查找与 pair 中的两个(即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)

-1in指的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()

但是使用np.argwhereCT Zhu的答案中建议的绝对更好。

于 2013-10-07T15:27:58.770 回答
4

尝试:

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

简要说明。e-np.array([1,2])返回[0,0][1,2]在数组中的位置enp.all(..., axis=2返回 Boolean 数组:Trueif[0,0] False否则(因此诸如[1,1]将变为 False 之类的东西)。最后,只需将其从 e 切片。

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

np.argwhere(np.all((e-array([1,2]))==0, axis=2))
于 2013-10-07T15:27:50.733 回答
2

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

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,在这种情况下,只有一个 at (0, 0)

于 2013-10-07T16:07:20.860 回答
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
于 2013-10-07T15:41:22.433 回答