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]]
。
答案 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)
被多次调用,则此问题才会加剧。