Python numpy矩阵计数不同

Python numpy矩阵计数不同,python,numpy,Python,Numpy,假设有一个numpy包含以下数据结构: import numpy as np a = np.array([['2','W','A'], ['3', 'R', 'A'], ['4', 'W', 'R'], ['2', 'E', 'R'], ['4', 'E', 'Y'], ['3', 'E', 'Y']]) 需要在第三列中汇总唯一实例的外观数并返回numpy,以便

假设有一个numpy包含以下数据结构:

import numpy as np


a = np.array([['2','W','A'],
             ['3', 'R', 'A'],
             ['4', 'W', 'R'],
             ['2', 'E', 'R'],
             ['4', 'E', 'Y'],
             ['3', 'E', 'Y']])
需要在第三列中汇总唯一实例的外观数并返回numpy,以便返回以下结果: 例如,A的值在第三列中出现两次,因此结果将是“A”“2”

类似地,对第二列和第三列中的唯一值求和,并在以下结构中返回numpy: 例如,第二列中的E值与第三列中的Y值一起出现两次,因此结果将为“E”Y“2”。

设置代码

import pandas as pd
import numpy as np

a = np.array(
   [['2', 'W', 'A'],
   ['3', 'R', 'A'],
   ['4', 'W', 'R'],
   ['2', 'E', 'R'],
   ['4', 'E', 'Y'],
   ['3', 'E', 'Y']],    
)
Pandas非常适合这种情况,并在后端利用numpy。例如,可以获得第二列、第三列计数,如下所示:

df = pd.DataFrame(a)    
cols = [1,2]
df[cols].value_counts().astype("str").reset_index().values
结果:

array([['E', 'Y', '2'],
       ['W', 'R', '1'],
       ['W', 'A', '1'],
       ['R', 'A', '1'],
       ['E', 'R', '1']], dtype=object)
设置代码

import pandas as pd
import numpy as np

a = np.array(
   [['2', 'W', 'A'],
   ['3', 'R', 'A'],
   ['4', 'W', 'R'],
   ['2', 'E', 'R'],
   ['4', 'E', 'Y'],
   ['3', 'E', 'Y']],    
)
Pandas非常适合这种情况,并在后端利用numpy。例如,可以获得第二列、第三列计数,如下所示:

df = pd.DataFrame(a)    
cols = [1,2]
df[cols].value_counts().astype("str").reset_index().values
结果:

array([['E', 'Y', '2'],
       ['W', 'R', '1'],
       ['W', 'A', '1'],
       ['R', 'A', '1'],
       ['E', 'R', '1']], dtype=object)

对于第一种情况,可以使用np.unique,并指定axis=0以将行制成表格:

def tabulate_array(x,columns):
    idx,counts = np.unique(x[:,columns],return_counts=True,axis=0)
    return [list(idx[i]) + list(str(counts[i])) for i in range(len(counts))]
连接计数和列表的最后一部分可能会进一步细化,但现在它将为您提供字符串输出,例如:

tabulate_array(a,[2])
[['A', '2'], ['R', '2'], ['Y', '2']]

tabulate_array(a,[1,2])
[['E', 'R', '1'],
 ['E', 'Y', '2'],
 ['R', 'A', '1'],
 ['W', 'A', '1'],
 ['W', 'R', '1']]

对于第一种情况,可以使用np.unique,并指定axis=0以将行制成表格:

def tabulate_array(x,columns):
    idx,counts = np.unique(x[:,columns],return_counts=True,axis=0)
    return [list(idx[i]) + list(str(counts[i])) for i in range(len(counts))]
连接计数和列表的最后一部分可能会进一步细化,但现在它将为您提供字符串输出,例如:

tabulate_array(a,[2])
[['A', '2'], ['R', '2'], ['Y', '2']]

tabulate_array(a,[1,2])
[['E', 'R', '1'],
 ['E', 'Y', '2'],
 ['R', 'A', '1'],
 ['W', 'A', '1'],
 ['W', 'R', '1']]
使用numpy,然后重新格式化

import numpy as np


a = np.array([['2','W','A'],
             ['3', 'R', 'A'],
             ['4', 'W', 'R'],
             ['2', 'E', 'R'],
             ['4', 'E', 'Y'],
             ['3', 'E', 'Y']])

unique, counts = np.unique(a[:, 2], return_counts=True)
result = np.vstack([unique, counts]).T
print(result)
关于第二个问题: 如果您想要避免for循环或列表理解,并且坚持使用纯numpy,并且愿意放弃输出的精确格式,您可以这样做

ind_col = np.core.defchararray.add(a[:, 1], a[:, 2])
unique, counts = np.unique(ind_col, return_counts=True)
result1 = np.vstack([unique, counts]).T

print(result1)
使用numpy,然后重新格式化

import numpy as np


a = np.array([['2','W','A'],
             ['3', 'R', 'A'],
             ['4', 'W', 'R'],
             ['2', 'E', 'R'],
             ['4', 'E', 'Y'],
             ['3', 'E', 'Y']])

unique, counts = np.unique(a[:, 2], return_counts=True)
result = np.vstack([unique, counts]).T
print(result)
关于第二个问题: 如果您想要避免for循环或列表理解,并且坚持使用纯numpy,并且愿意放弃输出的精确格式,您可以这样做

ind_col = np.core.defchararray.add(a[:, 1], a[:, 2])
unique, counts = np.unique(ind_col, return_counts=True)
result1 = np.vstack([unique, counts]).T

print(result1)

有趣的是,你想要的是实例数,但是字符串格式。也许是我,但你能明确表示唯一实例的外观数是什么意思吗?对不起。。。有一个数据错误,我编辑了这篇文章。有趣的是,你想要实例的数量,但是是字符串格式。也许是我,但是你能明确你所说的唯一实例的外观数量是什么意思吗?对不起。。。有一个数据错误,我编辑了这篇文章。