如何计算二维numpy数组的每一行和每列中的非零元素的个数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

我有一个numpy矩阵,它包含大部分非零值,但偶尔也会包含一个零值。我需要能够:

)计算每一行中的非零值,并将该计数放入一个变量中,我可以在后续操作中使用该变量,也许可以通过迭代行索引并在迭代过程中执行计算。

2.)计算每列中的非零值,并将该计数放入一个变量中,我可以在以后的操作中使用该变量,也许可以通过迭代列索引并在迭代过程中执行计算。

例如,我需要做的一件事是对每一行进行求和,然后将每一行和除以每一行中的非零值数,为每一行索引报告一个单独的结果。然后,我需要对每一列进行求和,然后将列和除以列中的非零值的数目,并报告每个列索引的单独结果。我也需要做其他的事情,但他们应该是容易的,在我知道如何做我在这里列出的事情。

下面是我正在使用的代码。您可以看到,我正在创建一个零数组,然后从CSV文件中填充它。有些行将包含所有列的值,但其他行的最后几列中仍保留一些零,从而造成上述问题。

下面的最后5行代码来自本论坛上的另一篇文章,最后5行代码返回了一个打印出来的0行/列索引列表。但是,我不知道如何使用这些结果信息来创建上面描述的非零行计数和非零列计数。

ANOVAInputMatrixValuesArray=zeros([len(TestIDs),9],float)
j=0
for j in range(0,len(TestIDs)):
    TestID=str(TestIDs[j])
    ReadOrWrite='Read'
    fileName=inputFileName
    directory=GetCurrentDirectory(arguments that return correct directory)
    inputfile=open(directory,'r')
    reader=csv.reader(inputfile)
    m=0
    for row in reader:
        if m<9:
            if row[0]!='TestID':
                ANOVAInputMatrixValuesArray[(j-1),m]=row[2]
                m+=1
    inputfile.close()

IndicesOfZeros = indices(ANOVAInputMatrixValuesArray.shape) 
locs = IndicesOfZeros[:,ANOVAInputMatrixValuesArray == 0]
pts = hsplit(locs, len(locs[0]))
for pt in pts:
    print(', '.join(str(p[0]) for p in pt))
提问于
用户回答回答于

一种快速计算枕稀疏矩阵中每行非零元素的方法m是:

np.diff(m.tocsr().indptr)

indptr属性表示数据中与行之间边界相对应的索引。因此,计算每个条目之间的差异将提供每行中非零元素的数量。

同样,对于每列中的非零元素数,请使用:

np.diff(m.tocsc().indptr)

如果数据已经以适当的形式出现,您同时需要行和列的零计数,并且比如说,m已经是CSR,您可以使用:

row_nonzeros = np.diff(m.indptr)
col_nonzeros = np.bincount(m.indices)

它比第一次转换为CSC(即O(m.getnnz()))得到col_nonzeros,但由于实现细节,速度更快。

用户回答回答于
ANOVAInputMatrixValuesArray = zeros([len(TestIDs), 9], float)
for j, TestID in enumerate(TestIDs):
    ReadOrWrite = 'Read'
    fileName = inputFileName
    directory = GetCurrentDirectory(arguments that return correct directory)
    # use directory or filename to get the CSV file?
    with open(directory, 'r') as csvfile:
        ANOVAInputMatrixValuesArray[j,:] = loadtxt(csvfile, comments='TestId', delimiter=';', usecols=(2,))[:9]

nonZeroCols = (ANOVAInputMatrixValuesArray != 0).sum(0)
nonZeroRows = (ANOVAInputMatrixValuesArray != 0).sum(1)

若要获取所有列/行的平均值,请使用以下命令:

colMean = a.sum(0) / (a != 0).sum(0)
rowMean = a.sum(1) / (a != 0).sum(1)

扫码关注云+社区