我有一个NumPy
矩阵,它包含大多数非零值,但偶尔也包含零值。我需要能够:
例如,我需要做的一件事是对每行求和,然后将每行和除以每行中非零值的数量,为每行索引报告一个单独的结果。然后我需要对每一列求和,然后将列总和除以该列中非零值的数量,同时为每个列索引报告一个单独的结果。我还需要做其他事情,但在我弄清楚如何做我在这里列出的事情之后,它们应该很容易。
下面是我正在使用的代码。您可以看到,我正在创建一个零数组,然后从一个csv
文件填充它。一些行将包含所有列的值,但其他行仍将在最后一些列中保留一些零,从而产生上述问题。
下面最后五行代码来自本论坛上的另一篇帖子。这最后五行代码返回一个打印的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))
有人能帮我吗?
发布于 2010-09-26 17:22:39
import numpy as np
a = np.array([[1, 0, 1],
[2, 3, 4],
[0, 0, 7]])
columns = (a != 0).sum(0)
rows = (a != 0).sum(1)
变量(a != 0)
是一个与原始a
形状相同的数组,它包含所有非零元素的True
。
.sum(x)
函数对轴x
上的元素求和。Sum of True/False
elements是True
元素的数目。
变量columns
和rows
包含原始数组的每一列/行中的非零(元素!= 0)值的数量:
columns = np.array([2, 1, 3])
rows = np.array([2, 3, 1])
编辑:整个代码可能如下所示(在原始代码中做了一些简化):
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)
编辑2个
要获取所有列/行的平均值,请使用以下命令:
colMean = a.sum(0) / (a != 0).sum(0)
rowMean = a.sum(1) / (a != 0).sum(1)
如果列/行中没有非零元素,您想要做什么?然后我们可以调整代码来解决这样的问题。
发布于 2013-05-06 11:55:56
计算scipy稀疏矩阵m
中每行非零元素的快速方法是:
np.diff(m.tocsr().indptr)
CSR矩阵的indptr
属性指示与行之间的边界相对应的数据内的索引。因此,计算每个条目之间的差异将提供每行中非零元素的数量。
类似地,对于每列中非零元素的数量,使用:
np.diff(m.tocsc().indptr)
如果数据已经以适当的形式存在,那么它们将分别在O(m.shape[0]
)和O(m.shape[1]
)中运行,而不是在Marat和Finn的解决方案中运行O(m.getnnz()
)。
如果您同时需要行和列的非零计数,并且假设m
已经是CSR,则可以使用:
row_nonzeros = np.diff(m.indptr)
col_nonzeros = np.bincount(m.indices)
这并不比第一次转换为CSC (这是用于获取col_nonzeros
的O(m.getnnz()
)),但由于实现细节而更快)要快得多。
发布于 2012-07-29 22:03:59
更快的方法是克隆你的矩阵,而不是实际的值。然后只需按行或列进行求和:
X_clone = X.tocsc()
X_clone.data = np.ones( X_clone.data.shape )
NumNonZeroElementsByColumn = X_clone.sum(0)
NumNonZeroElementsByRow = X_clone.sum(1)
对我来说,这比Finnärup Nielsen的解决方案快50倍(1秒对53秒)
编辑:您可能需要通过以下方式将NumNonZeroElementsByColumn转换为一维数组
np.array(NumNonZeroElementsByColumn)[0]
https://stackoverflow.com/questions/3797158
复制相似问题