Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.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中选择矩阵中的非零列_Python_Python 3.x_Numpy - Fatal编程技术网

如何在python中选择矩阵中的非零列

如何在python中选择矩阵中的非零列,python,python-3.x,numpy,Python,Python 3.x,Numpy,假设我有以下格式的数据: C0 C1 C2 C3 C4 C5 C6 C7 C8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 4 5 6 0 0 0 1 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 我想选择非零列,例如python中的列C1、C2、C3、C4、C5、C6。任何可以直接为我提供所需格式的命令。如果您使用像pandas这样的库,那么它会更简单

假设我有以下格式的数据:

C0 C1 C2 C3 C4 C5 C6 C7 C8
0  0  0  0  0  0  0  0  0
0  0  0  0  0  0  0  0  0
0  0  2  3  4  5  6  0  0
0  1  4  5  6  7  8  0  0
0  0  0  0  0  0  0  0  0

我想选择非零列,例如python中的列
C1、C2、C3、C4、C5、C6
。任何可以直接为我提供所需格式的命令。

如果您使用像pandas这样的库,那么它会更简单

您只需取每列的平均值,如果它们大于0,则它们是您所需的列

为此,我将给您一段代码:

import pandas as pd

df = pd.read_csv("File Path")
a = df.mean(axis=0) #gives you column wise mean
for i in len(a):
   if a[i] > 0:
      print(i)  # i will be your column

假设矩阵实现为列表列表,其中第一个索引是列,第二个索引是行:

matrix[3][2] == 3
然后,您可以使用列表理解来获得一个列表,其中仅包含
矩阵中不全为零的列

nonzero_columns = [column for column in matrix if any(column)]
# any() will return true here if any element of column is nonzero

您可以使用
any
numpy
索引来选择具有非零值的列

设置



使用
numpy

import numpy as np 

a = np.array([[0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0],
              [0,0,2,3,4,5,6,0,0],
              [0,1,4,5,6,7,8,0,0],
              [0,1,4,5,6,7,8,0,0]])

r = np.nonzero(np.any(a != 0, axis=0))[0]

>>> r
[1 2 3 4 5 6]
如果您需要这些列名(
C1
C2
C3
C4
C5
C6
),请使用
pandas

columns = ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8']
s = pd.DataFrame(data=a, columns=columns).any()

s = s[s == 1]

>>> s
C1    True
C2    True
C3    True
C4    True
C5    True
C6    True
dtype: bool

这是什么样的数据结构?包含C1、C2、C3、C4、C5列的矩阵,C6@RayyanKhan什么样的矩阵?熊猫DF,NumPy数组,Python列表列表。。。等等@Tomothy32,我有一个n*n格式的NumPy数组,因为数组的大小更大,我不认为使用loop可以得到期望的结果,因为它需要大量的计算时间。该数组的大小不超过_columns@RayyanKhan.any()似乎是唯一的其他方法,但是这也使用了loopsYes,但是为了让你明白我使用了这种方法如果这有助于你,请将其作为验证答案谢谢你的友好回复。另外,如果我想以类似的方式排除行,比如如果我想要第2行和第3行,我应该使用什么命令?行应该是
a[a.any(1)]
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 2, 3, 4, 5, 6],
       [1, 4, 5, 6, 7, 8],
       [0, 0, 0, 0, 0, 0]], dtype=int64)
import numpy as np 

a = np.array([[0,0,0,0,0,0,0,0,0],
              [0,0,0,0,0,0,0,0,0],
              [0,0,2,3,4,5,6,0,0],
              [0,1,4,5,6,7,8,0,0],
              [0,1,4,5,6,7,8,0,0]])

r = np.nonzero(np.any(a != 0, axis=0))[0]

>>> r
[1 2 3 4 5 6]
columns = ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8']
s = pd.DataFrame(data=a, columns=columns).any()

s = s[s == 1]

>>> s
C1    True
C2    True
C3    True
C4    True
C5    True
C6    True
dtype: bool