2011-06-06 107 views
3

我对numpy非常陌生,我试图在recarray中替换一个值。所以,我有此数组:numpy:替换重新数组中的值

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 

哪些工作,但我宁愿有办法在整个recarray做到这一点。任何人有更好的解决方案?

+0

我怕我不明白你的问题。第二种解决方案是好的 - 也许你想详细说明“在整个阵列上做它”部分 – 2011-06-06 22:33:43

+1

我想补充说另一种解决方案是使用熊猫而不是重新阵列。 – 2013-03-07 16:09:51

回答

3

numpy的“逐个元素”操作(至少可以在没有循环的情况下在数组的所有元素上执行某个函数)根据我所知不能用于recarrays。您只能使用单个列来完成此操作。

如果你想使用recarrays,我认为最简单的解决办法是循环中的不同列,但你想要另一种解决方案,但你可以做到这一点很自动是这样的:

for fieldname in a.dtype.names: 
    ind = a[fieldname] == '' 
    a[fieldname][ind] = '54321' 

但也许你应该考虑你是否真的需要重新编码,而不能只使用普通的ndarray。当然,如果你只有一种数据类型(如例子),那么唯一的好处就是列名。

+0

太好了,谢谢!是否可以删除重新数组中的列?或者我还必须使用ndarrays呢? – reisner 2011-06-08 20:38:20

+2

有一些特殊的功能来操作recarrays(但它们有点隐藏)。你可以使用''numpy.lib.recfunctions.drop_fields()''来删除一列。你可以在这里找到关于函数的信息(http://pyopengl.sourceforge.net/pydoc/numpy.lib.recfunctions.html)或[这里](http://projects.scipy.org/numpy/browser/躯干/ numpy的/ LIB/recfunctions.py?转= 8306)。另外matplotlib在[mlab库]中有一些特殊功能(http://matplotlib.sourceforge.net/api/mlab_api.html#record-array-helper-functions)。 – joris 2011-06-09 00:14:04

-1

一个可能的解决方案:

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