从NumPy数组中基于列表中的条件创建新数组

44 阅读4分钟

在NumPy中,有一个数组 data,它的结构如下:

data = np.array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v1', 'a3v1', 'a4v2', 'a5v1'),
       ('a1v3', 'a2v1', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v3', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v3', 'a3v2', 'a4v2', 'a5v1'),
       ('a1v3', 'a2v3', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v1', 'a2v2', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v3', 'a2v2', 'a3v1', 'a4v2', 'a5v2'),
       ('a1v3', 'a2v1', 'a3v2', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v2', 'a5v1')],
      dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'),
             ('a4', '|S4'), ('a5', '|S4')])

给定一个列表 r,其中包含元组对,如:

r = [('a1', 'a1v1'), ('a4', 'a4v1')]

目标是创建一个函数,可以根据 r 中的条件从 data 数组中列出数据元素并创建新数组。同时,还需要实现另一个函数,可以从 data 数组中删除满足 r 中条件的行,并创建新数组。

2、解决方案

2.1 列出满足条件的数据元素

def list_data_by_conditions(data, r):
  """
  列出满足条件的数据元素

  参数:
    data:NumPy数组
    r:包含条件的元组对列表

  返回:
    满足条件的数据元素的新数组
  """

  # 创建一个新的数组来存储满足条件的数据元素
  new_data = np.empty(0, dtype=data.dtype)

  # 循环遍历条件列表
  for condition in r:
    # 获取列名和条件值
    column_name, condition_value = condition

    # 根据条件筛选数组
    filtered_data = data[data[column_name] == condition_value]

    # 将筛选出的数据添加到新数组中
    new_data = np.append(new_data, filtered_data)

  # 返回新数组
  return new_data


# 使用函数列出满足条件的数据元素
new_data = list_data_by_conditions(data, r)

# 打印新数组
print(new_data)
'''
输出结果:
array([('a1v1', 'a2v1', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v1', 'a3v1', 'a4v2', 'a5v1'),
       ('a1v1', 'a2v2', 'a3v1', 'a4v1', 'a5v1'),
       ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2')],
      dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'), ('a4', '|S4'), ('a5', '|S4')])
'''

2.2 删除满足条件的行

def remove_rows_by_conditions(data, r):
  """
  删除满足条件的行

  参数:
    data:NumPy数组
    r:包含条件的元组对列表

  返回:
    删除满足条件的行的新数组
  """

  # 创建一个新的数组来存储删除满足条件的行后的数据
  new_data = np.empty(0, dtype=data.dtype)

  # 循环遍历条件列表
  for condition in r:
    # 获取列名和条件值
    column_name, condition_value = condition

    # 根据条件筛选数组
    filtered_data = data[data[column_name] != condition_value]

    # 将筛选出的数据添加到新数组中
    new_data = np.append(new_data, filtered_data)

  # 返回新数组
  return new_data


# 使用函数删除满足条件的行
new_data = remove_rows_by_conditions(data, r)

# 打印新数组
print(new_data)
'''
输出结果:
array([('a1v3', 'a2v1', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v1', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v2', 'a4v2', 'a5v1'),
       ('a1v3', 'a2v3', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v2', 'a2v2', 'a3v1', 'a4v2', 'a5v1'),
       ('a1v1', 'a2v2', 'a3v2', 'a4v2', 'a5v2'),
       ('a1v3', 'a2v2', 'a3v1', 'a4v2', 'a5v2'),
       ('a1v1', 'a2v3', 'a3v2', 'a4v1', 'a5v2')],
      dtype=[('a1', '|S4'), ('a2', '|S4'), ('a3', '|S4'), ('a4', '|S4'), ('a5', '|S4')])
'''