假设你有一个结构化的numpy数组,它是从csv生成的,第一行是字段名。数组的形式是:
dtype([('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ..., ('n','<f8'])
字符串现在,假设你想从这个数组中删除第i列,有什么方便的方法吗?我想要一个它像删除工作:
new_array = np.delete(old_array, 'i')
型有什么想法吗?
66bbxpm51#
这不是一个简单的函数调用,但下面展示了一种删除第i个字段的方法:
In [67]: aOut[67]: array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0)], dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])In [68]: i = 1 # Drop the 'B' fieldIn [69]: names = list(a.dtype.names)In [70]: namesOut[70]: ['A', 'B', 'C']In [71]: new_names = names[:i] + names[i+1:]In [72]: new_namesOut[72]: ['A', 'C']In [73]: b = a[new_names]In [74]: bOut[74]: array([(1.0, 3.0), (4.0, 6.0)], dtype=[('A', '<f8'), ('C', '<f8')])
In [67]: a
Out[67]:
array([(1.0, 2.0, 3.0), (4.0, 5.0, 6.0)],
dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8')])
In [68]: i = 1 # Drop the 'B' field
In [69]: names = list(a.dtype.names)
In [70]: names
Out[70]: ['A', 'B', 'C']
In [71]: new_names = names[:i] + names[i+1:]
In [72]: new_names
Out[72]: ['A', 'C']
In [73]: b = a[new_names]
In [74]: b
Out[74]:
array([(1.0, 3.0), (4.0, 6.0)],
dtype=[('A', '<f8'), ('C', '<f8')])
字符串作为一个函数打包:
def remove_field_num(a, i): names = list(a.dtype.names) new_names = names[:i] + names[i+1:] b = a[new_names] return b
def remove_field_num(a, i):
names = list(a.dtype.names)
new_names = names[:i] + names[i+1:]
b = a[new_names]
return b
型删除给定的字段 name 可能更自然:
def remove_field_name(a, name): names = list(a.dtype.names) if name in names: names.remove(name) b = a[names] return b
def remove_field_name(a, name):
if name in names:
names.remove(name)
b = a[names]
型另外,请查看matplotlib的mlab module中的drop_rec_fields函数。
mlab
drop_rec_fields
wdebmtf22#
在谷歌上搜索了我的方式,并从沃伦的回答中了解了我需要知道的内容后,我忍不住发布了一个更简洁的版本,增加了一个选项,可以一次性有效地删除多个字段:
def rmfield( a, *fieldnames_to_remove ): return a[ [ name for name in a.dtype.names if name not in fieldnames_to_remove ] ]
def rmfield( a, *fieldnames_to_remove ):
return a[ [ name for name in a.dtype.names if name not in fieldnames_to_remove ] ]
字符串示例如下:
a = rmfield(a, 'foo')a = rmfield(a, 'foo', 'bar') # remove multiple fields at once
a = rmfield(a, 'foo')
a = rmfield(a, 'foo', 'bar') # remove multiple fields at once
型或者如果我们真的要打高尔夫球,下面是等价的:
rmfield=lambda a,*f:a[[n for n in a.dtype.names if n not in f]]
型
smtd7mpg3#
最简单的解决方案是使用内置函数假设有points_array = np.array这个np.array有多个列,其中一个是“classes”
points_array = np.array
np.array
import numpy.lib.recfunctions as recfcpoints_array = recfc.drop_fields(points_array, "classes", usemask=False)
import numpy.lib.recfunctions as recfc
points_array = recfc.drop_fields(points_array, "classes", usemask=False)
字符串
3条答案
按热度按时间66bbxpm51#
这不是一个简单的函数调用,但下面展示了一种删除第i个字段的方法:
字符串
作为一个函数打包:
型
删除给定的字段 name 可能更自然:
型
另外,请查看matplotlib的
mlab
module中的drop_rec_fields
函数。wdebmtf22#
在谷歌上搜索了我的方式,并从沃伦的回答中了解了我需要知道的内容后,我忍不住发布了一个更简洁的版本,增加了一个选项,可以一次性有效地删除多个字段:
字符串
示例如下:
型
或者如果我们真的要打高尔夫球,下面是等价的:
型
smtd7mpg3#
最简单的解决方案是使用内置函数
假设有
points_array = np.array
这个np.array
有多个列,其中一个是“classes”字符串