如果第二个元素不是dupli,则删除2d numpy数组的行

2024-09-22 20:36:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个numpy数组:

a = [['I05', 'U13', 4],
     ['I12', 'U13', 5],
     ['I22', 'U13', 3],
     ['I03', 'U15', 5],
     ['I14', 'U23', 5],
     ['I12', 'U23', 2],
     ['I15', 'U43', 5]]

这里我们有两个U13条目和三个U23条目。所以我需要保留那些数组,去掉其余的。你知道吗

我希望在删除后得到这样的结果:

a = [['I05', 'U13', 4],
     ['I12', 'U13', 5],
     ['I22', 'U13', 3],
     ['I14', 'U23', 5],
     ['I12', 'U23', 2]]

如何有效地做到这一点?你知道吗

数组已经在第二列(值'UXX')上排序。你知道吗


Tags: numpy排序条目数组i12i03u13u15
2条回答

此方法应达到预期输出:

import numpy as np
from collections import Counter

a = np.array([['I05', 'U13', 4],
              ['I12', 'U13', 5],
              ['I22', 'U13', 3],
              ['I03', 'U15', 5],
              ['I14', 'U23', 5],
              ['I12', 'U23', 2],
              ['I15', 'U43', 5]])

# counts number of occurrences of each value in second column
d = Counter(a[:,1])

# creates an index where these counts are > 1
index_keep = [i for i, j in enumerate(a[:,1]) if d[j] > 1]

print(a[index_keep])

>>> [['I05' 'U13' '4']
     ['I12' 'U13' '5']
     ['I22' 'U13' '3']
     ['I14' 'U23' '5']
     ['I12' 'U23' '2']]

对于混合类型,熊猫是一个方便的选择。由于数据已排序,因此只需保留重复项:

import pandas as pd
import numpy as np

A = np.array([('I05', 'U13', 4),
              ('I12', 'U13', 5),
              ('I22', 'U13', 3),
              ('I03', 'U15', 5),
              ('I14', 'U23', 5),
              ('I12', 'U23', 2),
              ('I15', 'U43', 5)],
            dtype='object, object, i4')

df = pd.DataFrame(A)
B = df[df.duplicated(subset=['f1'], keep=False)].values

print(B)

array([['I05', 'U13', 4],
       ['I12', 'U13', 5],
       ['I22', 'U13', 3],
       ['I14', 'U23', 5],
       ['I12', 'U23', 2]], dtype=object)

注意NumPy会自动添加名称。这是一个结构化数组,不是元组数组:

print(A)

array([('I05', 'U13', 4), ('I12', 'U13', 5), ('I22', 'U13', 3),
       ('I03', 'U15', 5), ('I14', 'U23', 5), ('I12', 'U23', 2),
       ('I15', 'U43', 5)], 
      dtype=[('f0', 'O'), ('f1', 'O'), ('f2', '<i4')])

相关问题 更多 >