Numpy返回非预期值

时间:2017-06-30 14:43:12

标签: python numpy

我正在尝试获取已填充的行中的元素索引。

我尝试使用numpy where()函数,但它只返回非零元素的索引。

import numpy as np
board = np.array([[0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 2, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [2, 2, 2, 2],
                  [0, 0, 0, 0]])
for rows in board:
    if set(rows) == {2}:
        if len(set(rows)) <= 1:
            print(np.where(board == rows))

我想要的输出如下:

(array([9, 9, 9, 9], dtype=int32), array([0, 1, 2, 3], dtype=int32)) 

即row,col。

然而,我得到了这个:

(array([2, 9, 9, 9, 9], dtype=int32), array([1, 0, 1, 2, 3], dtype=int32)) 

如上所述,它应该只获得填充行中元素的索引。董事会1没有填充2,但它被包含在内。

3 个答案:

答案 0 :(得分:1)

根本不需要循环。要查找用0以外的其他内容填充的行,请使用.all(axis=1)axis参数告诉哪个轴在以下位置查找匹配值:

>>> (board != 0).all(axis=1)
array([False, False, False, False, False, False, False, False, False,
    True, False], dtype=bool)

如果有一行填充非零值,则布尔值为True,否则为False。如果您将outer product的行数组中的True值设为True,那么您将在与整行对应的矩阵位置中得到>>> np.outer((board!=0).all(axis=1),np.ones(board.shape[1], dtype=bool)) array([[False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [False, False, False, False], [ True, True, True, True], [False, False, False, False]], dtype=bool)

True

然后,您可以使用np.where()获取>>> np.where(np.outer((board!=0).all(axis=1),np.ones(board.shape[1], dtype=bool))) (array([9, 9, 9, 9]), array([0, 1, 2, 3])) 值的索引:

np.where()

请注意,np.int64会返回np.int32个值。如果你想要>>> yind, xind = np.where(np.outer((board!=0).all(axis=1),np.ones(board.shape[1], dtype=bool))) >>> yind = np.int32(yind) >>> xind = np.int32(xind) >>> yind, xind (array([9, 9, 9, 9], dtype=int32), array([0, 1, 2, 3], dtype=int32)) ,那么只需分配变量并转换它们:

zip(*)

要将所有这些索引设置为元组,请使用*(如果您不熟悉>>> [(y,x) for y,x in zip(*np.where(np.outer((board!=0).all(1), np.ones(board.shape[1]))))] [(9, 0), (9, 1), (9, 2), (9, 3)] 解包,请参阅here获取解释):

np.int32

如果您需要>>> [(y.astype(np.int32),x.astype(np.int32)) for y,x in zip(*np.where(np.outer((board == 2).all(1), np.ones(board.shape[1]))))] [(9, 0), (9, 1), (9, 2), (9, 3)] ,请再次在理解中指定:

int index;
bool bIsConverted = int.TryParse(e.CommandArgument.ToString().Trim(), out index);
GridViewRow selectedRow = gvTradeCallOffList.Rows[index];

答案 1 :(得分:0)

如果我理解得很好,你试图找到你的numpy数组完全填满的行(没有0值)

所以我请你考虑一下:

import numpy as np
board = np.array([[0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 2, 0, 0],
                  [1, 1, 1, 1],   # added this one just to generalize in 
                  [0, 0, 0, 0],   # case you have numbers != 2
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [2, 2, 2, 2],
                  [0, 0, 0, 0]])
for i,rows in enumerate(board):
    if not 0 in set(rows): # changed this to work on all non zero numbers
        print(rows)
        if len(set(rows)) <= 1:
            print(i)

输出:

[1 1 1 1] # first row filled
3         # its index as int ( if that's what you're looking for )
[2 2 2 2] # seconds row filled
9         # its index as int

您需要的只是enumerate内置函数。快乐编码

答案 2 :(得分:0)

如果我正确理解了您的问题,您希望找到数组中特定元素的行索引。因此,您需要使用以下print()语句而不是print(np.where(board == rows))

print(np.where((board == rows).all(axis=1)))

输出:

(array([9], dtype=int64),)

要获取特定的行号,您可以执行以下操作。

loc = np.where((board == rows).all(axis=1))
print(loc[0][0]) # prints 9

完成计划:

import numpy as np
board = np.array([[0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 2, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [0, 0, 0, 0],
                  [2, 2, 2, 2],
                  [0, 0, 0, 0]])
for rows in board:
    if set(rows) == {2}:
        print(rows)
        if len(set(rows)) <= 1:
            print(np.where((board == rows).all(axis=1)))