Python 理解np.all和删除索引时缺少元素
我有一个大小为(400,40)的数据集。有些列完全为零。它们不是计算所必需的(我需要忽略它们),但它们是重写文件所必需的 所以我使用numpy将其作为数组导入,完成初始化。但是,当我尝试逆矩阵(同样,计算需要)时,出现了一个问题。据我所知,如果一个矩阵有一个完整的零列,就不可能求逆(det(M)=0) 所以我用这个来得到非零列:Python 理解np.all和删除索引时缺少元素,python,windows,python-3.x,numpy,Python,Windows,Python 3.x,Numpy,我有一个大小为(400,40)的数据集。有些列完全为零。它们不是计算所必需的(我需要忽略它们),但它们是重写文件所必需的 所以我使用numpy将其作为数组导入,完成初始化。但是,当我尝试逆矩阵(同样,计算需要)时,出现了一个问题。据我所知,如果一个矩阵有一个完整的零列,就不可能求逆(det(M)=0) 所以我用这个来得到非零列: nonZero = dataSet[:, np.all(dataSet != 0, axis=0)] (我还尝试在np.all中使用np.sum对列求和),但它毫无理
nonZero = dataSet[:, np.all(dataSet != 0, axis=0)]
(我还尝试在np.all中使用np.sum对列求和),但它毫无理由跳过了一些列
例如,我的第一行有:
[ 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 ] etc.
当我运行上述代码时,我得到:
[ -1. -2. -3. 181. 8. 8. 1. 9. 9. 1. ]
5451和0.11消失,即使整列不等于0,也不等于0
我还需要得到删除的列索引,因为我需要在计算之后重新连接它们
我不是最好的Python程序员,但我似乎无法解决这个问题,也无法理解为什么会发生这种情况。我最近学会了如何使用numpy,我是一个非常初学者。这已经困扰我两天了。感谢您的推荐/帮助。您的逻辑有误。您不希望放弃所有值均为非零的列。给出了要放弃全部为零的列的说明: 例如:
arr = np.array([[1, 1, 0, 1, 0, 0, 1, 0, 0, 1],
[1, 0, 0, 1, 1, 1, 1, 0, 0, 1],
[0, 1, 0, 1, 0, 1, 0, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 1, 0, 0, 0, 0, 1, 0]])
arr[:, ~np.all(arr == 0, axis=0)]
# array([[1, 1, 1, 0, 0, 1, 0, 1],
# [1, 0, 1, 1, 1, 1, 0, 1],
# [0, 1, 1, 0, 1, 0, 0, 0],
# [1, 0, 1, 0, 0, 0, 1, 0],
# [0, 0, 1, 0, 0, 0, 1, 0]])
但您也可以使用而不是np.all
:
arr[:, np.any(arr != 0, axis=0)]
最好使用较小的示例 例如:
arr = np.array([
[0, 0, 1],
[0, 1, 1]
])
nonzero = arr != 0
print(nonzero)
# prints
# [[False False True]
# [False True True]]
all_nonzero = np.all(nonzero, axis=0)
print(all_nonzero)
# prints
# [False False True]
现在你看到问题了。您的逻辑创建一个列掩码,该掩码只选择列中所有元素均为非零的列。实际上,您需要的是并非所有元素都为零的列,或者换句话说:列中的任何元素都不是零
any_nonzero = np.any(nonzero, axis=0)
print(any_nonzero)
# prints
# [False True True]
np.all
与类似,如果值为零,它将检查每个值。您想要的是使用np.any
来表示或类似的行为,即如果您想忽略非零列示例中存在的0
dataSet = np.array([[ 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 ],
[ 0, -1, -2, -3, 181, 5451, 0, 0, 8, 8, 1, 9, 9, 1, 0, 0, 0 ],
[ 0, -1, -2, -3, 181, 0, 0, 0, 8, 8, 1, 9, 9, 1, 0.11, 0, 0 ]])
nonZero = dataSet[:, np.any(dataSet, axis=0)]
nonZero
输出:
(array([ 0, 6, 7, 15, 16]),)
(数组([0,6,7,15,16]),)
啊,我问错了。是的,这才是真正的逻辑!谢谢你的推荐,但对我不起作用。未对行进行任何更改:\n哦,不管我的逻辑是否正确,但我的代码是错误的。但还是没用。我想我如何导入列表有问题…谢谢你的解释。现在我明白了问题所在。不幸的是,我还在学习python,不知道我们是否可以用bools进行调试!
np.where(~dataSet.any(axis=0))
(array([ 0, 6, 7, 15, 16]),)