Python np.delete问题

时间:2015-06-22 14:58:39

标签: python numpy

A = np.array([[1,2,3],[3,4,5],[5,6,7]])
X = np.array([[0, 1, 0]])
for i in xrange(np.shape(X)[0]):
    for j in xrange(np.shape(X)[1]):
        if X[i,j] == 0.0:
            A = np.delete(A, (j), axis=0)

如果j在索引A处有0,我尝试从X删除j。我得到了

IndexError: index 2 is out of bounds for axis 0 with  size 2.

如果X为[[0,1,0]],则A应为[[3,4,5]]

1 个答案:

答案 0 :(得分:3)

不要在循环中调用np.delete。使用布尔索引会更快:

In [6]: A[X.astype(bool).any(axis=0)]
Out[6]: array([[3, 4, 5]])

X.astype(bool)将0变为False,将任何非零值变为True

In [9]: X.astype(bool).any(axis=0)
Out[9]: array([False,  True, False], dtype=bool)
如果.any(axis=0)列中的任何值为True,则True的调用会返回X.astype(bool),否则会False

在循环遍历同一列表时从列表(或数组)中删除项目为a classic pitfall。问题是由 从列表中删除项目的事实改变了序数的含义 索引,以便如果您使用序数索引删除其他项目,您可能会结束 删除错误的项目,如果您尝试索引超出,则获取IndexError 修改后的列表的有效范围。

在您的情况下,当您遍历A行并删除A:

行时
for j in xrange(np.shape(X)[1]):
    if X[i,j] == 0.0:
        A = np.delete(A, j, axis=0)

每次将A索引修改为A更改。所以

        A = np.delete(A, 0, axis=0)

删除原始A的第一行,但现在新A只有两行。 所以

        A = np.delete(A, 2, axis=0)

引发IndexError,因为2指的是第三行,而新的A没有第三行。如果i - 循环导致A = np.delete(A, j, axis=0)被多次调用,则此问题才会加剧。