如何从结构化numpy数组中删除列?

mpbci0fu  于 2024-01-08  发布在  其他
关注(0)|答案(3)|浏览(198)

假设你有一个结构化的numpy数组,它是从csv生成的,第一行是字段名。数组的形式是:

  1. dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ..., ('n','<f8'])

字符串
现在,假设你想从这个数组中删除第i列,有什么方便的方法吗?
我想要一个它像删除工作:

  1. new_array = np.delete(old_array, 'i')


有什么想法吗?

66bbxpm5

66bbxpm51#

这不是一个简单的函数调用,但下面展示了一种删除第i个字段的方法:

  1. In [67]: a
  2. Out[67]:
  3. array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0)],
  4. dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
  5. In [68]: i = 1 # Drop the 'B' field
  6. In [69]: names = list(a.dtype.names)
  7. In [70]: names
  8. Out[70]: ['A', 'B', 'C']
  9. In [71]: new_names = names[:i] + names[i+1:]
  10. In [72]: new_names
  11. Out[72]: ['A', 'C']
  12. In [73]: b = a[new_names]
  13. In [74]: b
  14. Out[74]:
  15. array([(1.0, 3.0), (4.0, 6.0)],
  16. dtype=[('A', '<f8'), ('C', '<f8')])

字符串
作为一个函数打包:

  1. def remove_field_num(a, i):
  2. names = list(a.dtype.names)
  3. new_names = names[:i] + names[i+1:]
  4. b = a[new_names]
  5. return b


删除给定的字段 name 可能更自然:

  1. def remove_field_name(a, name):
  2. names = list(a.dtype.names)
  3. if name in names:
  4. names.remove(name)
  5. b = a[names]
  6. return b


另外,请查看matplotlib的mlab module中的drop_rec_fields函数。

展开查看全部
wdebmtf2

wdebmtf22#

在谷歌上搜索了我的方式,并从沃伦的回答中了解了我需要知道的内容后,我忍不住发布了一个更简洁的版本,增加了一个选项,可以一次性有效地删除多个字段:

  1. def rmfield( a, *fieldnames_to_remove ):
  2. return a[ [ name for name in a.dtype.names if name not in fieldnames_to_remove ] ]

字符串
示例如下:

  1. a = rmfield(a, 'foo')
  2. a = rmfield(a, 'foo', 'bar') # remove multiple fields at once


或者如果我们真的要打高尔夫球,下面是等价的:

  1. rmfield=lambda a,*f:a[[n for n in a.dtype.names if n not in f]]

展开查看全部
smtd7mpg

smtd7mpg3#

最简单的解决方案是使用内置函数
假设有points_array = np.array这个np.array有多个列,其中一个是“classes”

  1. import numpy.lib.recfunctions as recfc
  2. points_array = recfc.drop_fields(points_array, "classes", usemask=False)

字符串

相关问题