Python 3.x 根据python矩阵中特定行中的值计算列值

Python 3.x 根据python矩阵中特定行中的值计算列值,python-3.x,numpy,Python 3.x,Numpy,我必须设计一个函数,该函数可以在考虑引用行的情况下计算具有相同值(每列)的行数 每行的结果数组将为 mat = [ [1,3,5,7], [1,2,5,7], [8,2,3,4] ] 矩阵矩阵的每一行都是用户,每一列都是用户在定义的时间单位中的位置标记。因此,我必须计算每个定义的时间(即列)有多少用户共享同一位置 我尝试使用numpy count_nonzero函数,但它需要一个条件,即我无法在所有引用行中分布。有一个简单的解决方案,即1)计算每列中的元素数,2)使用该计数构建另一个列表 从集

我必须设计一个函数,该函数可以在考虑引用行的情况下计算具有相同值(每列)的行数

每行的结果数组将为

mat = [ [1,3,5,7], [1,2,5,7], [8,2,3,4] ]
矩阵矩阵的每一行都是用户,每一列都是用户在定义的时间单位中的位置标记。因此,我必须计算每个定义的时间(即列)有多少用户共享同一位置


我尝试使用numpy count_nonzero函数,但它需要一个条件,即我无法在所有引用行中分布。有一个简单的解决方案,即1)计算每列中的元素数,2)使用该计数构建另一个列表

从集合导入计数器
mat=[[1,3,5,7],[1,2,5,7],[8,2,3,4]]
col_计数=[拉链(*mat)中col的计数器(col)]
结果=[[count[cell]表示单元格,count in zip(行,列计数)]表示mat中的行]
结果是:

row0 = [2,1,2,2]
row1 = [2,2,2,2]
row3 = [1,2,1,1]
请注意,在第一行
[1,3,5,7]
中,元素
3
对应于
1
而不是零,因为第二列
[3,2,2]
中正好有一个
3

一个稍微轻一点的解决方案(一次只使用一个计数器),我还逐行详细介绍了转换,以便更容易理解:

def行数(mat):
def行_变换(行):
计数=计数器(行)
返回[第行中e的计数[e]
马特=拉链(*mat)
马特计数=贴图(行变换,马特)
返回邮政编码(*matT_count)

如果您需要一个列表,那么您可以调用
list(row\u count(mat))
如果您只需要迭代您的行,那么您可以对row\u count(mat)中的行执行
并且它将为您节省更多内存(一次只实例化一行)

一个简单的矢量化解决方案是使用

[[2, 1, 2, 2], [2, 2, 2, 2], [1, 2, 1, 1]]
64x8640矩阵的计时:

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

tmp = mat + np.arange(mat.shape[1]) * np.max(mat)
np.bincount(tmp.ravel())[tmp]
# array([[2, 1, 2, 2],
#        [2, 2, 2, 2],
#        [1, 2, 1, 1]])

下面是一个使用'argsort'的
numpy
解决方案。这可以处理非整数项:

# 4 ms ± 300 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
多快

import numpy as np

def count_per_col(a):
    o = np.argsort(a, 0)
    ao = np.take_along_axis(a, o, 0)
    padded = np.ones((ao.shape[1], ao.shape[0]+1), int)
    padded[:, 1:-1] = np.diff(ao, axis=0).T
    i, j = np.where(padded)
    j = np.maximum(np.diff(j), 0)
    J = j.repeat(j)
    out = np.empty(a.shape, int)
    np.put_along_axis(out, o, J.reshape(out.shape[::-1]).T, 0)
    return out

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

count_per_col(mat)
# array([[2, 1, 2, 2],
#        [2, 2, 2, 2],
#        [1, 2, 1, 1]])

非常感谢。输入中的同一行中是否有重复项?
from timeit import timeit

large = np.random.randint(0, 100, (100, 10000))
large = np.random.random(100)[large]

timeit(lambda: count_per_col(large), number=10)/10
# 0.1332556433044374