NumPy:在记录数组中替换值

3

我是一个numpy的新手,我想替换一个recarray中的值。所以我有这个数组:

import numpy as np
d = [('1', ''),('4', '5'),('7', '8')]
a = np.array(d, dtype=[('first', 'a5'), ('second', 'a5')])

我想做类似这样的事情:
ind = a=='' #Replace all blanks
a[ind] = '12345'

但是那并不起作用。我能够做到这一点:
col = a['second']
ind = col=='' #Replace all blanks
col[ind] = '54321'
a['second'] = col

这种方法可以运行,但我更希望有一种方法能够在整个记录数组上执行。有没有更好的解决方案?


很抱歉,我不明白你的问题。第二个解决方案是可以的 - 也许你想详细说明一下“在整个数组上执行”的部分。 - Jim Brissom
1
我想补充另一个解决方案是使用pandas而不是recarray。 - Dav Clark
2个回答

5
据我所知,numpy的“逐元素”操作(可以在不使用循环的情况下对数组的所有元素执行某些函数)与recarrays不兼容。您只能使用单独的列进行操作。
如果您想要使用recarrays,我认为最简单的解决方案是循环不同的列,尽管您希望有其他解决方案,但您可以通过以下方式轻松自动化此过程:
for fieldname in a.dtype.names:
    ind = a[fieldname] == ''
    a[fieldname][ind] = '54321'

但是也许你应该考虑一下是否真的需要使用recarrays,而不能只使用普通的ndarray。当然,如果你只有一种数据类型(就像这个例子中一样),那么唯一的优势就是列名。


太好了,谢谢!在 recarray 中删除一列是否可能?还是我也必须使用 ndarrays? - reisner
3
有一些特殊的函数可以操作记录数组(recarray),但它们有点隐蔽。您可以使用 numpy.lib.recfunctions.drop_fields() 来删除一列。您可以在此处此处找到这些函数的相关信息。此外,matplotlib在mlab库中也有一些特殊的函数。 - joris

-1

一个可能的解决方案:

a[np.where(a['second']=='')[0][0]]['second']='12345'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接