Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解np.all和删除索引时缺少元素_Python_Windows_Python 3.x_Numpy - Fatal编程技术网

Python 理解np.all和删除索引时缺少元素

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对列求和),但它毫无理

我有一个大小为(400,40)的数据集。有些列完全为零。它们不是计算所必需的(我需要忽略它们),但它们是重写文件所必需的

所以我使用numpy将其作为数组导入,完成初始化。但是,当我尝试逆矩阵(同样,计算需要)时,出现了一个问题。据我所知,如果一个矩阵有一个完整的零列,就不可能求逆(det(M)=0)

所以我用这个来得到非零列:

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]),)